6

我需要通过 HTTP 开始下载一些内容,然后将数据作为反应流读取。

因此,即使下载的数据很大,我几乎可以立即读取响应正文的前几个字节(无需等待整个响应正文)。然后,进行一些计算,并在几秒钟内读取另一部分数据。缓存数据必须有一些限制,因为操作内存无法处理全部内容(数十 GB)。

我一直在尝试使用HttpClient'ssendAsync方法BodyHandlers.ofInputStream(),但它总是阻塞并等待所有数据到达。

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://..."))
    .build();

HttpResponse<InputStream> response = client
    .sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
    .get(); // this finishes as soon as the header is received

try {
    InputStream stream = response.body();
    byte[] test = stream.readNBytes(20); // trying to read just a few bytes
                                         // but it waits for the whole body
} catch (IOException ex) {}

我需要更改什么以便逐渐下载响应正文?

4

1 回答 1

2

这是一个错误。它已在 Java 11.0.2 中修复: https ://bugs.openjdk.java.net/browse/JDK-8212926

于 2018-12-18T17:20:37.253 回答