Мне нужно начать загрузку некоторого контента по 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) {}
Что мне нужно изменить, чтобы тело ответа загружалось постепенно?