Java:使用并行流复制文件
我在一所大学学习计算机科学,我被指派创建一个正常的程序,一个使用隐式并发(并行流)的程序和一个使用显式并发(线程池) 我使用Java.NIOlib创建了一个批处理文件复制器(从源到目标)。 我正在试图弄清楚如何使用并行流来实现。 我有一个字符串数组,其中包含文件路径/名称,然后我有这个循环,以便将文件复制到目标:Java:使用并行流复制文件,java,concurrency,parallel-processing,file-copying,Java,Concurrency,Parallel Processing,File Copying,我在一所大学学习计算机科学,我被指派创建一个正常的程序,一个使用隐式并发(并行流)的程序和一个使用显式并发(线程池) 我使用Java.NIOlib创建了一个批处理文件复制器(从源到目标)。 我正在试图弄清楚如何使用并行流来实现。 我有一个字符串数组,其中包含文件路径/名称,然后我有这个循环,以便将文件复制到目标: int i = 0; while (i < filelist.length){ String filepath = filelist[i]; Path sourc
int i = 0;
while (i < filelist.length){
String filepath = filelist[i];
Path source = Paths.get(filepath);
Path target = Paths.get(FileBrowser.destinationpath+"/"+filenames[i]);
try {
//replace existing file using java nio package
System.out.println(Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING));
} catch (IOException e) {
e.printStackTrace();
}
i++;
}
inti=0;
while(i
如果您有任何关于如何使用并行流进行此操作的帮助,我们将不胜感激
PS.I知道并行复制文件不会导致文件复制速度更快,而不是顺序复制,因为这不是CPU问题,更重要的是磁盘问题。无论哪种方法,这个任务都是测试和报告结果,所以我选择了这种方法。使用Java 8,您可以作为并行流迭代任何列表。因此,使用您的代码,您可以执行以下操作:
Arrays.asList(filelist).parallelStream().forEach((filepath) -> {
Path source = Paths.get(filepath);
Path target = Paths.get(FileBrowser.destinationpath+"/"+filepath]);
try {
//replace existing file using java nio package
System.out.println(Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING));
} catch (IOException e) {
e.printStackTrace();
}
});
如果有多个磁盘,速度可能会更快。还要注意的是,在Java9和Java8上使用并行流可能会得到更好的结果,因为性能已经得到了改进:@assylias谢谢你的提醒,我想问的是可能吗?我似乎不知道如何将这段代码作为并行流应用。感谢您的回复,我不能使用以下选项:Path target=Path.get(FileBrowser.destinationpath+“/”+filepath);对于文件名,我有一个不同的字符串数组,Path target=Path.get(FileBrowser.destinationpath+“/”+filenames[I]);我已经修改了你的答案,它是有效的:)我通过这个并行流复制文件的时间也更好!文件:85总大小:440.57 MB普通38.79 35.98 36.24并行32.93 32.63 35.19线程池37.53 40.06 36.01