【发布时间】:2017-04-23 12:19:53
【问题描述】:
我想使用 Stream API 以深度优先顺序遍历 Java 8 中的目录结构。这样做的原因是我想根据每个目录中每个文件中存在的时间戳对文件中的内容进行排序。本质上,我正在寻找类似于Files#walk 的东西,但用于目录。我怎样才能做到这一点?
【问题讨论】:
-
为什么一定要使用流 API?它并不是真正为递归而设计的。
标签: java java-8 java-stream
我想使用 Stream API 以深度优先顺序遍历 Java 8 中的目录结构。这样做的原因是我想根据每个目录中每个文件中存在的时间戳对文件中的内容进行排序。本质上,我正在寻找类似于Files#walk 的东西,但用于目录。我怎样才能做到这一点?
【问题讨论】:
标签: java java-8 java-stream
使用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
【讨论】:
iterate() 或 generate() 这样的普通流 API 是不可行的。最好的选择可能是实现一种预购的TreeIterator 并流式传输它。
StreamEx dep。它功能强大(参见EntryStream)而且体积小。这是一个救生员。
很难理解您的问题描述,最值得注意的是,当您说要“根据每个目录中每个文件中存在的时间戳对文件中的内容进行排序”时,您实际上想要做什么。
当你说你想要“类似于 Files#walk 但用于目录的东西”时,这意味着你在将Files.walk 用于目录时遇到了问题,但不清楚你有什么问题。
即,您可以简单地列出当前目录的所有子目录,如
Files.walk(Paths.get("")).filter(Files::isDirectory).forEach(System.out::println);
因此,如果这与您的目标不符,您就必须花更多时间来阐述您的目标。
【讨论】: