Я использую CompletableFuture
для асинхронной операции, чтобы загрузить файл и сохранить его содержимое с помощью OutputStream
. Приведенный ниже код работает, но компилятор дает мне предупреждение либо использовать try-with-resources
, либо закрыть OutputStream
в finally-clause
, хотя он закрывается после завершения Future в whenComplete
.
Код:
final OutputStream outputStream = Files.newOutputStream(file.toPath());
final String url = "https://example.com/some-download.zip";
final CompletionStage<WSResponse> futureResponse = this.client
.url(url)
.setMethod("GET")
.stream();
futureResponse.thenCompose(res -> {
downloadTask.setTotalBytes(res);
Source<ByteString, ?> responseBody = res.getBodyAsSource();
Sink<ByteString, CompletionStage<akka.Done>> outputWriter =
Sink.foreach(bytes -> {
downloadTask.addReceivedBytes(bytes.size());
System.out.println(downloadTask.getProgressAsString());
outputStream.write(bytes.toArray());
});
return responseBody.runWith(outputWriter, this.materializer);
}).whenComplete((res, error) -> {
try {
outputStream.close();
} catch (final IOException e) {
e.printStackTrace();
}
});
Внимание:
![enter image description here](https://i.stack.imgur.com/4zBQf.png)
Проблема:
Когда я использую try-with-resources
, программа закрывает OutPutStream
, прежде чем что-либо записывается в файл, из-за асинхронной природы CompletableFuture
, которая не блокируется.
Так есть ли способ объявить OutputStream
внутри CompletionStage
и передать его по строке?