#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 создается внутренний буферный массив. Когда байты из потока считываются или пропускаются, внутренний буфер заполняется по мере необходимости из содержащегося входного потока, по много байтов за раз