如果此代码遇到的第一个文件是目录,将会发生什么。为什么不忽略该目录中的所有其他文件(从而使结果模糊)?
取自How do I iterate through the files in a directory in Java?
我并不是想对此代码起作用,但它如何解释上述情况呢?
public static void main(String... args) {
File[] files = new File("C:/").listFiles();
showFiles(files);
}
public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getName());
}
}
}
最佳答案
它不会忽略它,因为它只是在进行另一个递归调用-原始调用(具有顶层文件的集合)仍在堆栈中。它使用新的文件列表进行新的调用,并在新的堆栈帧中由称为files
的新参数引用。
因此,如果目录结构为c:/a/b/c
,您将得到以下堆栈:
showFiles([c:/a/b/c])
showFiles([c:/a/b])
showFiles([c:/a])
main(...)
当“最深”调用(堆栈的顶部)返回时,下一个堆栈帧仍将知道同一级别的任何其他文件,并且可能会再次递归。