【问题标题】:Non-recursive way to get all files in a directory and its subdirectories in Java在Java中获取目录及其子目录中所有文件的非递归方式
【发布时间】:2011-10-10 05:08:13
【问题描述】:

我正在尝试获取目录及其子目录中所有文件的列表。我目前的递归方法如下:

private void printFiles(File dir) {
  for (File child : dir.listFiles()) {
    if (child.isDirectory()) {
      printFiles(child);
    } else if (child.isFile()) {
      System.out.println(child.getPath());
    }
  }
}

printFiles(new File("somedir/somedir2"));

但是,我希望有一种非递归方式(可能是现有的 API 调用)来执行此操作。如果不是,这是最干净的方法吗?

【问题讨论】:

  • Recursively list files in Java 的可能副本。标题是递归的,但第一个答案是库调用。
  • @cularis 不是重复的,因为我试图以非递归方式进行,而另一个 SO 问题是要求以递归方式进行。
  • 递归有什么问题?没有用于此的 API,但是您仍然可以使用 while 循环和其他一些有趣的业务来完成它,但这会很混乱。
  • @Kshitij 在回复之前阅读完整的评论和答案。
  • 无论哪种方式,我都相信这个问题为社区提供了价值,因为搜索它的人乍一看会因为标题而忽略另一个问题(就像我一样)

标签: java file directory subdirectory


【解决方案1】:

您始终可以通过使用堆栈(用于 DFS)或队列(用于 BFS)将递归解决方案替换为迭代解决方案:

private void printFiles(File dir) {
  Stack<File> stack = new Stack<File>();
  stack.push(dir);
  while(!stack.isEmpty()) {
    File child = stack.pop();
    if (child.isDirectory()) {
      for(File f : child.listFiles()) stack.push(f);
    } else if (child.isFile()) {
      System.out.println(child.getPath());
    }
  }
}

printFiles(new File("abc/def.ghi"));

【讨论】:

  • 有时我不喜欢 Eclipse 启动需要多长时间。做得好。我很惊讶为什么有些工程师会想知道为什么递归会不好,为什么使用堆栈会很混乱。
  • 堆栈方法看起来比递归方法更好,谢谢!
  • 堆栈方法如何更好?当然它可能会快一点,但递归非常简单和优雅。在内部,递归无论如何都使用堆栈。
  • 速度和递归必须将整个函数的状态(在我的问题中为了将其发布到 SO 上已被剥离)的状态都存储在堆栈上,而使用这种方法,我只是将文件对象保存在堆栈上
  • 嘿,这太完美了,我们能不能把它限制在深度 2 或 5……就像一些不超过这个数字。
【解决方案2】:

Java 8 以后,您可以使用Files#walk 以递归方式列出给定目录中的所有文件和目录。此外,如果您只需要常规文件,您可以应用Files::isRegularFile 之类的过滤器来过滤掉目录。

另一方面,如果您只需要列出给定目录而不列出其子目录,您可以使用惰性方法Files#list,它只会为您提供给定目录中的文件和目录。您可以再次进一步应用上述过滤器。

【讨论】:

    【解决方案3】:

    FileUtils 可能是最好的选择。 (链接问题的副本) 仅发布,以便搜索此内容的人会看到它,并且可能不会阅读 cmets

    edit: 使用 Listfiles 的方法

    【讨论】:

    • 也许我遗漏了一些东西,但我正在查看 FileUtils 文档,并且在构造函数下有一条注释说“不应在标准编程中构造实例。”
    • 是的......实例......你应该使用它们提供的静态方法。 (顺便说一句,它们几乎都是静态的)
    • 遇到了另一个问题; Eclipse 无法识别 FileUtils 类。我应该导入哪个包?
    • 啊,看来我还是不能用了。没有安装其他库的选项。不过还是谢谢!
    • 这是学校分布式文件系统作业的一部分,测试代码的机器没有安装 apache commons 库。
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2017-04-03
    • 2012-07-22
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2017-03-15
    相关资源
    最近更新 更多