Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用并行流复制文件_Java_Concurrency_Parallel Processing_File Copying - Fatal编程技术网

Java:使用并行流复制文件

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

我在一所大学学习计算机科学,我被指派创建一个正常的程序,一个使用隐式并发(并行流)的程序和一个使用显式并发(线程池)

我使用Java.NIOlib创建了一个批处理文件复制器(从源到目标)。 我正在试图弄清楚如何使用并行流来实现。

我有一个字符串数组,其中包含文件路径/名称,然后我有这个循环,以便将文件复制到目标:

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