Как реактивно загружать и обрабатывать большие данные? - PullRequest
0 голосов
/ 16 декабря 2018

Мне нужно начать загрузку некоторого контента по HTTP, а затем прочитать данные как реактивный поток.

Итак, хотя загруженные данные большие, я почти сразу могу прочитать первые несколько байтовТело ответа (не нужно ждать всего тела ответа).Затем выполните некоторые вычисления и через несколько секунд прочитайте другую часть данных.Должен быть некоторый предел кэшируемых данных, потому что оперативная память не может обрабатывать весь контент (его десятки ГБ).

Я пытался использовать HttpClient метод sendAsyncс 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) {}

Что мне нужно изменить, чтобы тело ответа загружалось постепенно?

1 Ответ

0 голосов
/ 18 декабря 2018

Это ошибка.Это было исправлено в Java 11.0.2: https://bugs.openjdk.java.net/browse/JDK-8212926

...