Я реализую программу на Java, которая загружает веб-страницы по протоколу HTTP. После отправки запроса GET
на сервер и чтения заголовков ответа (включая content-length
) программа считывает в массив char
количество символов (как указано в content-length
).
Я пробовал использовать оба BufferedReader
и InputStreamReader
классов.
Проблема
Если content-length
достаточно велико, считывается только часть потока, а остальные байты не затрагиваются (например, мой конец прочитал все доступные байты, а другой конец еще не закончил запись).
Причина
Как указано в документации класса BufferedReader
:
This iterated
read
continues until one of the following conditions becomes true: *The specified number of characters have been read The read
method of the underlying stream returns *-1
, indicating end-of-file, or * *The ready
method of the underlying stream * returnsfalse
, indicating that further input requests * would block.
Я боюсь, что пуля номер 3 приводит к тому, что read
завершает работу в середине, хотя указанное количество байтов еще не прочитано.
Я могу реализовать эту функциональность сам, но мне было интересно, есть ли какой-нибудь класс, который игнорирует маркер номер 3 и блокируется до тех пор, пока все байты не будут прочитаны, я не смог найти ни одного.
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(stream))) {
char[] arr = new char[contentLength];
buffer.read(arr, 0, contentLength);
text.append(arr);
}