目录递归 - 如果遇到第一个文件是dir,会发生什么

时间:2012-01-30 11:44:05

标签: java file-io recursion

如果此代码遇到的第一个文件是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());
            }
        }
    }

4 个答案:

答案 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变量。