Java中使用常规和增强for循环的目录遍历
我有这个代码来打印出所有的目录和文件。我尝试使用递归方法调用for循环。使用增强的for循环,代码可以正确地打印出所有目录和文件。但对于常规for循环,代码不起作用。我对常规for循环和增强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();
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;jchildFiles
是一个字段。这意味着使用目录作为参数对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
是共享的?这是你的另一个更改,不是吗?谢谢你的回答。它起了作用。你说得对,我不应该使用类变量,它在递归调用。捕捉得好!