Java Dir递归-如果第一个文件遇到的是Dir

Java Dir递归-如果第一个文件遇到的是Dir,java,file-io,recursion,Java,File Io,Recursion,如果此代码遇到的第一个文件是dir,会发生什么。为什么它不忽略该目录中的所有其他文件(因此模糊了结果) 这是从 我不想质疑这段代码是否有效,但它如何解释上述场景 public static void main(String... args) { File[] files = new File("C:/").listFiles(); showFiles(files); } public static void showFiles(File[] f

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

这是从

我不想质疑这段代码是否有效,但它如何解释上述场景

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

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

它不会忽略它,因为它只是进行另一个递归调用-原始调用(带有来自顶层的文件集合)仍在堆栈上。它使用一个新的文件列表进行新调用,该列表由新堆栈框架中名为
files
的新参数引用

因此,如果目录结构为
c:/a/b/c
,那么您将得到一堆:

showFiles([c:/a/b/c])
showFiles([c:/a/b])
showFiles([c:/a])
main(...)

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

它只会推另一个堆栈帧,当递归调用完成时,它可以恢复到它以前离开的位置。

它只会推另一个堆栈帧,递归调用完成后,它可以恢复到以前离开的位置。

它工作,因为变量
files
是一个局部变量,即方法
showFiles
的每次调用都有一个实例。通过这种方式,所有方法的执行都是相互独立的,并且不会阻塞它们的
文件
变量。

之所以有效,是因为变量
文件
是一个局部变量,即方法
showFiles
的每次调用都有一个实例。这样,所有方法的执行都是相互独立的,不会阻塞它们的
文件
变量。

当它遇到的第一个条目是目录时,它会递归地调用
showFiles()
来处理该目录的内容。当此调用返回时,循环将继续执行对
showFiles()

的第一次调用中的条目。当它遇到的第一个条目是目录时,它将递归地调用
showFiles()
来处理该目录的内容。当此调用返回时,循环将继续执行对
showFiles()
的第一次调用中的条目