在Java中有没有一种异步的方式将一个文件复制到另一个文件?我想找类似于C#中Stream.CopyToAsync方法的解决方案。
我的目标是从互联网上下载一系列约40个文件,以下是我为每个文件想出的最佳解决方案:
CompletableFuture.allOf(myFiles.stream()
.map(file -> CompletableFuture.supplyAsync(() -> syncDownloadFile(file)))
.toArray(CompletableFuture[]::class))
.then(ignored -> doSomethingAfterAllDownloadsAreComplete());
其中 syncDownloadFile
是:
private void syncDownloadFile(MyFile file) {
try (InputStream is = file.mySourceUrl.openStream()) {
long actualSize = Files.copy(is, file.myDestinationNIOPath);
// size validation here
} catch (IOException e) {
throw new RuntimeException(e);
}
}
但这意味着我在任务执行器内有一些阻塞调用,我希望避免这种情况,以便不会一次阻塞太多执行器。
我不确定C#方法是否内部执行相同的操作(我的意思是,某些内容必须下载该文件,对吗?)。
有更好的方法来完成这个任务吗?
Files.copy
,这是一个阻塞调用。 - Daniel