Java中使用常规和增强for循环的目录遍历

Java中使用常规和增强for循环的目录遍历,java,Java,我有这个代码来打印出所有的目录和文件。我尝试使用递归方法调用for循环。使用增强的for循环,代码可以正确地打印出所有目录和文件。但对于常规for循环,代码不起作用。我对常规for循环和增强for循环之间的差异感到困惑 public class FileCopy { private File[] childFiles = null; public static void main(String[] args) { FileCopy fileCopy = new FileCopy();

我有这个代码来打印出所有的目录和文件。我尝试使用递归方法调用for循环。使用增强的for循环,代码可以正确地打印出所有目录和文件。但对于常规for循环,代码不起作用。我对常规for循环和增强for循环之间的差异感到困惑

public class FileCopy {

private File[] childFiles = null;

public static void main(String[] args) {
    FileCopy fileCopy = new FileCopy();
    File srcFile = new File("c:\\temp");                                    
    fileCopy.copyTree(srcFile);

}

public void copyTree(File file){

       if(file.isDirectory()){
         System.out.println(file + " is a directory. ");
         childFiles = file.listFiles();
         /*for(int j=0; j<childFiles.length; j++){
             copyTree(childFiles[j]);
         }*/                               //This regular for loop is not working
         for(File a: childFiles){
             copyTree(a);               //The enhanced for loop is working!
         }
         return;
       } else{
           System.out.println(file + " is a file. ");
           return;
       }
}   
公共类文件副本{
私有文件[]childFiles=null;
公共静态void main(字符串[]args){
FileCopy FileCopy=新建FileCopy();
文件srcFile=新文件(“c:\\temp”);
copyTree(srcFile);
}
公共无效复制树(文件){
if(file.isDirectory()){
System.out.println(file+“是一个目录”);
childFiles=file.listFiles();

/*for(int j=0;j问题不在于for循环,而在于代码

递归时,错误地重新分配和重用共享变量

private File[] childFiles = null;
现在应该可以这样做了:

import java.io.File;

public class FileCopy {

    /*private File[] childFiles = null;*/

    public static void main(String[] args) {
        FileCopy fileCopy = new FileCopy();
        File srcFile = new File("c:\\temp");                                    
        fileCopy.copyTree(srcFile);

    }

    public void copyTree(File file){
       if(file.isDirectory()){
         System.out.println(file + " is a directory. ");
         File[] childFiles = file.listFiles();           
         for(int j=0; j<childFiles.length; j++){
             copyTree(childFiles[j]);
         }                               //This regular for loop is now working
         /*for(File a: childFiles){
             copyTree(a);               //The enhanced for loop is working!
         }*/
       } else{
           System.out.println(file + " is a file. ");
       }
       return;
    }   
}
导入java.io.File;
公共类文件副本{
/*私有文件[]childFiles=null*/
公共静态void main(字符串[]args){
FileCopy FileCopy=新建FileCopy();
文件srcFile=新文件(“c:\\temp”);
copyTree(srcFile);
}
公共无效复制树(文件){
if(file.isDirectory()){
System.out.println(file+“是一个目录”);
File[]childFiles=File.listFiles();

for(int j=0;j
childFiles
是一个字段。这意味着使用目录作为参数对
copyTree
的每次调用都会更改字段值。for循环中的重要区别是:

for(文件a:childFiles)
始终使用开头的
childFiles
,即它相当于

File[] temp = childFiles;
for(int j=0; j<temp.length; j++) {
    File a = temp[j];
    // for body from your code follows
    copyTree(a);
}
File[]temp=childFiles;

对于(int j=0;j这很令人惊讶,因为两者应该编译成完全相同的字节码…你确定这是你唯一更改的吗?为什么
childFiles
是共享的?这是你的另一个更改,不是吗?谢谢你的回答。它起了作用。你说得对,我不应该使用类变量,它在递归调用。捕捉得好!