如果此代码遇到的第一个文件是目录,将会发生什么。为什么不忽略该目录中的所有其他文件(从而使结果模糊)?

取自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(...)


当“最深”调用(堆栈的顶部)返回时,下一个堆栈帧仍将知道同一级别的任何其他文件,并且可能会再次递归。

08-06 06:23