Как мне прочитать более одного байта с помощью BufferedInputStream

#java

#java

Вопрос:

Это точная цитата из моего текста:

 The purpose of I/O buffering is to improve system performance. 
Rather than reading a byte at a time, a large number of bytes are read together 
the first time the read() method is invoked.
  

Однако, когда я использую BufferedInputStream.read() все, что я могу сделать, это получить один байт. Что я делаю не так и что мне нужно делать?

Комментарии:

1. Технически вам не нужно ничего делать — большинство вызовов read() будут истощать внутренний буфер вместо того, чтобы каждый раз выполнять системный вызов, поэтому о буферизации позаботятся за вас. Вы также можете проверить javadoc для более полезного метода.

2. Как мне тогда получить доступ к данным в буфере? Где ссылка на буфер?

3. Вы не делаете этого напрямую — он абстрагируется от вас. Вы получаете доступ к буферу так же, как используете «обычный» InputStream . Ссылка в буфере скрыта внутри BufferedInputStream класса.

4. Тогда как мне с этим что-то делать? Например, вывести его где-нибудь?

5. Дело в том, что вам не нужно делать ничего особенного . Вы можете думать об этом как о простом повышении производительности обычного InputStream . Нет необходимости рассматривать это по-другому. Не должно быть причин для прямого доступа к буферу.

Ответ №1:

Это не вы, это поток, который считывает более одного символа за раз. BufferedInputStream Сохраняется буфер, и при следующем вызове read() следующий байт из этого буфера возвращается без какого-либо доступа к физическому диску (если только буфер не пуст и следующий фрагмент данных не должен быть считан в буфер).

Обратите внимание, что существуют методы, которые считывают больше байта, но на самом деле они не имеют отношения к разнице, которую вы явно указали в своем вопросе.

Ответ №2:

Класс BufferedInputStream облегчает буферизацию ваших входных потоков. Вместо того, чтобы читать по одному байту за раз из сети или с диска, вы читаете больший блок за раз.

Вы можете установить размер буфера, который будет использоваться внутри BufferedInputStream с помощью следующего конструктора

 InputStream input = new BufferedInputStream(new FileInputStream("PathOfFile"), 2 * 1024);
  

В этом примере размер буфера устанавливается равным 2 КБ

При создании BufferedInputStream создается внутренний буферный массив. Когда байты из потока считываются или пропускаются, внутренний буфер заполняется по мере необходимости из содержащегося входного потока, по много байтов за раз