我需要递归地对文件夹中的所有文件进行一些只读处理。我正在使用Files.walk
来获取文件流,但我注意到api指定walk
仅返回常规流,而不是并行流。
如何并行处理目录中的所有文件?
答案 0 :(得分:18)
您可以通过调用Stream
将任何Stream
转换为并行Stream::parallel
。
Stream<Path> stream = Files.walk(startPath).parallel().forEach(...);
答案 1 :(得分:3)
我有同样的问题。 Files.walk流似乎无法并行工作。通过调用foreach
将流转换为并行流之后,处理仅在一个线程中进行。
唯一的解决方案是将收集到的parallel()
转换为列表,并在该列表上创建并行流,如Tagir Valeev所述。
无效的解决方案:
Paths
工作解决方案:
Files.walk(Paths.get(System.getProperty("user.dir")))
.parallel()
.filter(Files::isRegularFile)
...