【问题标题】:Depth-first directory stream in Java 8Java 8 中的深度优先目录流
【发布时间】:2017-04-23 12:19:53
【问题描述】:

我想使用 Stream API 以深度优先顺序遍历 Java 8 中的目录结构。这样做的原因是我想根据每个目录中每个文件中存在的时间戳对文件中的内容进行排序。本质上,我正在寻找类似于Files#walk 的东西,但用于目录。我怎样才能做到这一点?

【问题讨论】:

  • 为什么一定要使用流 API?它并不是真正为递归而设计的。

标签: java java-8 java-stream


【解决方案1】:

使用StreamEx 轻而易举:

File root = new File("someFilePath");
StreamEx.ofTree(root, x -> StreamEx.of(x.listFiles(File::isDirectory)))
    .map(File::getAbsolutePath) // or whathever you need to do with the folder
    .forEach(System.out::println); // the same as previous line

【讨论】:

  • 谢谢。我投了赞成票,因为它看起来对我有用,但我更喜欢没有任何额外依赖项的 vanilla Java,所以我没有将其标记为已解决。
  • 很可能,仅使用 iterate()generate() 这样的普通流 API 是不可行的。最好的选择可能是实现一种预购的TreeIterator 并流式传输它。
  • 无论如何,我会添加StreamEx dep。它功能强大(参见EntryStream)而且体积小。这是一个救生员。
【解决方案2】:

很难理解您的问题描述,最值得注意的是,当您说要“根据每个目录中每个文件中存在的时间戳对文件中的内容进行排序”时,您实际上想要做什么。

当你说你想要“类似于 Files#walk 但用于目录的东西”时,这意味着你在将Files.walk 用于目录时遇到了问题,但不清楚你有什么问题。

即,您可以简单地列出当前目录的所有子目录,如

Files.walk(Paths.get("")).filter(Files::isDirectory).forEach(System.out::println);

因此,如果这与您的目标不符,您就必须花更多时间来阐述您的目标。

【讨论】:

  • 虽然听起来很尴尬,但实际上我认为这样就可以了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多