Чтение из InputStream точной длины

Я реализую программу на 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 * returns false, 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);
    }
    

    person johni    schedule 06.02.2016    source источник
    comment
    Не могли бы вы показать свой код?   -  person beny23    schedule 06.02.2016


    Ответы (1)


    Смысл части о методе ready() базового Reader заключается в том, что он будет блокироваться до тех пор, пока не будет передан хотя бы один символ, но не блокируется снова. Нет никакой гарантии, что он заполнит буфер.

    Вы должны зациклиться.

    person user207421    schedule 06.02.2016