Java 中的异步 File.copy
Asynchronous File.copy in Java
Java 中有没有一种方法可以以异步方式将一个文件复制到另一个文件中?我正在尝试查找类似于 C# 中 Stream.CopyToAsync 的内容。
我想要实现的是从 Internet 下载一系列约 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# 方法是否在内部执行相同的操作(我的意思是,必须下载该文件吗?)。
有没有更好的方法来完成这个?
AsynchronousFileChannel
(简称 AFC)是使用非阻塞 IO 管理 Java 中文件的正确方法。不幸的是,它不提供基于承诺(在 .net 中又称为 Task
)API,例如 .Net 的 CopyToAsync(Stream)
。
备选 RxIo 库建立在 AFC 之上,并提供 AsyncFiles
异步 API 与不同的调用习惯用法:基于回调,CompletableFuture
(相当于.net Task
) 以及反应流。
例如,可以异步地从一个文件复制到另一个文件:
Path in = Paths.get("input.txt");
Path out = Paths.get("output.txt");
AsyncFiles
.readAllBytes(in)
.thenCompose(bytes -> AsyncFiles.writeBytes(out, bytes))
.thenAccept(index -> /* invoked on completion */)
请注意,延续是由线程从后台调用的 AsynchronousChannelGroup
。
因此,您可以使用非阻塞 HTTP 客户端解决您的问题,将基于 ComplableFuture
的 API 链接到 AsyncFiles
使用。例如,AHC 是有效的选择。在此处查看用法:https://github.com/AsyncHttpClient/async-http-client#using-continuations
Java 中有没有一种方法可以以异步方式将一个文件复制到另一个文件中?我正在尝试查找类似于 C# 中 Stream.CopyToAsync 的内容。
我想要实现的是从 Internet 下载一系列约 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# 方法是否在内部执行相同的操作(我的意思是,必须下载该文件吗?)。
有没有更好的方法来完成这个?
AsynchronousFileChannel
(简称 AFC)是使用非阻塞 IO 管理 Java 中文件的正确方法。不幸的是,它不提供基于承诺(在 .net 中又称为 Task
)API,例如 .Net 的 CopyToAsync(Stream)
。
备选 RxIo 库建立在 AFC 之上,并提供 AsyncFiles
异步 API 与不同的调用习惯用法:基于回调,CompletableFuture
(相当于.net Task
) 以及反应流。
例如,可以异步地从一个文件复制到另一个文件:
Path in = Paths.get("input.txt");
Path out = Paths.get("output.txt");
AsyncFiles
.readAllBytes(in)
.thenCompose(bytes -> AsyncFiles.writeBytes(out, bytes))
.thenAccept(index -> /* invoked on completion */)
请注意,延续是由线程从后台调用的 AsynchronousChannelGroup
。
因此,您可以使用非阻塞 HTTP 客户端解决您的问题,将基于 ComplableFuture
的 API 链接到 AsyncFiles
使用。例如,AHC 是有效的选择。在此处查看用法:https://github.com/AsyncHttpClient/async-http-client#using-continuations