如果此代码遇到的第一个文件是dir,会发生什么。为什么它不会忽略该目录中的所有其他文件(因此模糊了结果)?
这取自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());
}
}
}
答案 0 :(得分:2)
当它遇到的第一个条目是一个目录时,递归地调用showFiles()
来处理该目录的内容。当此调用返回时,循环继续,第一次调用的条目为showFiles()
。
答案 1 :(得分:1)
它不会忽略它,因为它只是进行另一个递归调用 - 原始调用(来自顶层的文件集合)仍在堆栈中。它使用新文件列表进行 new 调用,该文件列表由 new中名为files
的 new 参数引用堆栈框架。
所以,如果有c:/a/b/c
的目录结构,你最终会得到一堆:
showFiles([c:/a/b/c])
showFiles([c:/a/b])
showFiles([c:/a])
main(...)
当“最深”调用(堆栈顶部)返回时,下一个堆栈帧仍将知道同一级别的任何其他文件,并且可能会再次递归。
答案 2 :(得分:1)
它只是推送另一个堆栈帧,当递归调用完成时,它可以恢复之前离开的位置。
答案 3 :(得分:0)
它起作用,因为变量files
是一个局部变量,即每次调用方法showFiles
都有一个实例。这样,所有方法执行都是彼此独立的,并且不会破坏它们的files
变量。