Java:使用并行流来复制文件

时间:2016-03-18 17:00:42

标签: java concurrency parallel-processing file-copying

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

我使用 Java.NIO lib创建了一个批处理文件复制器(源到目标)。 我想弄清楚如何使用并行流来完成。

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

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++;
}

任何有关如何使用并行流执行此操作的帮助将不胜感激。

PS。我知道并行复制文件不会导致文件被更快地复制而不是顺序复制,因为它不是CPU问题而是更多的磁盘问题。无论哪种方式,这项任务都是为了测试和报告结果,这就是我选择这种方法的原因。

1 个答案:

答案 0 :(得分:1)

使用Java 8,您可以将任何列表作为并行流进行迭代。因此,使用您的代码,您可以执行以下操作:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Define constants here:
set "LOCATION=.."
set "PATTERN=*.txt"
set /A LIMIT=2

set /A COUNT=0
pushd "%LOCATION%" && (
    for /R "." %%F in ("%PATTERN%") do (
        set /A COUNT+=1
        set "ITEM=%%~F"
        setlocal EnableDelayedExpansion
        for /F "tokens=1,* delims=|" %%S in ("!COUNT!|!ITEM!") do (
            endlocal
            set "ITEM[%%S]=%%T"
        )
    )
    popd
)
if %COUNT% GTR %LIMIT% (
    echo Cannot continue script, too many "%PATTERN%" files ^(%COUNT%^) encountered:
    for /L %%F in (1,1,%COUNT%) do (
        setlocal EnableDelayedExpansion
        echo(!ITEM[%%F]!
        endlocal
    )
    exit /B
)

rem Continue script here...

endlocal
exit /B