【问题标题】:Dir recursion - what happens if first file encounters is a dir目录递归 - 如果第一个文件遇到的是目录会发生什么
【发布时间】:2012-01-30 11:44:05
【问题描述】:

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

这取自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());
            }
        }
    }

【问题讨论】:

    标签: java file-io recursion


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      所以如果有c:/a/b/c 的目录结构,你最终会得到一堆:

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

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

      【讨论】:

        【解决方案3】:

        它只是压入另一个堆栈帧,当递归调用完成时,它可以从它之前离开的地方恢复。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2018-09-07
            • 2012-07-21
            • 1970-01-01
            • 2010-11-30
            • 1970-01-01
            • 1970-01-01
            • 2016-07-28
            • 2012-03-05
            相关资源
            最近更新 更多