Может ли BufferedReader читать байты?


Извините, если этот вопрос является тупым, но я не получил ответа, который искал.

Java docs говорит следующее

В общем случае каждый запрос на чтение, выполненный считывателем, вызывает соответствующий запрос на чтение базового символьного или байтового потока. Поэтому рекомендуется обернуть BufferedReader вокруг любого устройства чтения, операции которого read() могут быть дорогостоящими, например FileReaders >и InputStreamReaders. Например,

BufferedReader in = new BufferedReader(new FileReader("foo.in"));

Будет буферизовать ввод из указанного файла. Без буферизации каждый вызов read() или readLine() может привести к тому, что байты будут считываться из файла, преобразовываться в символы, а затем возвращаться, что может быть очень неэффективно.

  1. Мой первый вопрос: Если bufferedReader может читать байты, то почему мы не можем работать с изображениями, которые находятся в байтах, используя bufferedreader.

  2. Мой второй вопрос: Bufferedreader хранит символы в буфере и что такое смысл этой строки

Буферизует входные данные из указанного файла.

  1. мой третий вопрос: что означает эта строка

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

3 11

3 ответа:

  1. Поведение по умолчанию-это преобразование в символ, но когда у вас есть изображение, вы не можете иметь символьные данные, вместо этого вам нужен пиксель байтовых данных. Поэтому вы не можете его использовать.

  2. Это буферизация, то есть считывание определенного куска данных в массиве символов. Вы можете увидеть это поведение в коде:

 public BufferedReader(Reader in) {
               this(in, defaultCharBufferSize);
            }

И defaultCharBufferSize, как указано ниже:

Private static int defaultCharBufferSize = 8192;

3 Every time you do read operation, it will be reading only one character.

Таким образом, в двух словах, buffred означает, что он сначала прочитает несколько фрагментов символьных данных, которые будут храниться в массиве символов и которые будут обработаны, и снова он будет читать тот же фрагмент данных, пока не достигнет конца потока

Вы можете обратиться к следующему, чтобы узнать больше

BufferedReader

Здесь есть два вопроса.

1. Буферизация

Представьте, что вы живете в миле от вашего ближайшего источника воды, и вы пьете чашку воды каждый час. Ну, ты же не пойдешь до самой воды за каждой чашкой. Идите один раз в день и приходите домой с ведром, полным воды, чтобы наполнить чашку 24 раза. Ведро - это буфер . Представьте, что ваша деревня снабжается водой из реки. Но иногда река пересыхает на некоторое время. иногда река приносит так много воды,что деревню заливает. Итак, вы строите плотину, а за плотиной находится водохранилище. Водохранилище заполняется в сезон дождей и постепенно опорожняется в сухой сезон. Деревня получает постоянный поток воды круглый год. Резервуар - это буфер .

Потоков данных в вычислительной похожи на обоих этих сценариев. Например, вы можете получить несколько килобайт данных из файловой системы в одной операционной системе вызов, но если вы хотите обрабатывать один символ за раз, вам нужно что-то похожее на резервуар.

BufferedReader содержит в себе другое средство чтения (например, FileReader), которое является рекой-и массив байтов, который является резервуаром. Каждый раз, когда вы читаете из него, он делает что-то вроде:

 if there are not enough bytes in the "reservoir" to fulfil this request
      top up the "reservoir" by reading from the underlying Reader
 endif
 return some bytes from the "reservoir".

однако когда вы используете BufferedReader, вам не нужно знать , как он работает, только то, что он работает.

2. Пригодность для изображений

Важно понимать, что BufferedReader и FileReader являются примерамичитателей . Возможно, вы еще не изучали полиморфизм в своем программировании, поэтому, когда вы это сделаете, помните об этом. Это означает, что если у вас есть код, который использует FileReader, но только те его аспекты, которые соответствуют Reader, то вы можете заменить BufferedReader, и он будет работать точно так же.

Это хорошая привычка объявлять переменные как самый общий класс, который произведения:

 Reader reader = new FileReader(file);

... потому что тогда это будет единственное изменение, которое вам нужно добавить буферизацию:

 Reader reader = new BufferedReader(new FileReader(file));

Я сделал этот крюк, потому что это все Reader, которые менее подходят для изображений.

Reader имеет два метода read:

 int read(); // returns one character, cast to an int
 int read(char[] block); // reads into block, returns how many chars it read
Вторая форма не подходит для изображений, потому что она определенно читает символы, а не ints. Первая форма выглядит так, как будто она может быть в порядке-в конце концов, она читает ints. И действительно, если вы просто используете FileReader, это может быть хорошо работа. Однако подумайте о том, как будет работать BufferedReader, обернутый вокруг FileReader. Первый раз, когда вы называете командой bufferedreader.read (), он вызовет FileReader.read (buffer), чтобы заполнить его буфер. Затем он приведет первый char буфера обратно к int и вернет его.

Особенно когда вы вводите многобайтовые кодировки в изображение, это может вызвать проблемы.

Поэтому, если вы хотите читать целые числа, используйте InputStream, а не Reader. InputStream имеет int read(byte[] buf, int offset, int length) -- байт намного больше надежно отбрасывается назад и вперед от int, чем chars.

Читатели (и писатели) в java являются специализированными классами для работы с текстовыми (символьными) потоками - понятие строки бессмысленно в любом другом типе потока.

Для общего эквивалента IO, посмотрите на BufferedInputStream

Итак, чтобы ответить на ваши вопросы:

  1. в то время как читатель в конечном счете читает байты, он преобразует их в символы. он не предназначен для чтения чего - либо еще (например, изображений) - используйте семейство InputStream классов для это
  2. Буферизованное считывающее устройство считывает большие блоки данных из базового потока (который может быть файлом, сокетом или чем-либо еще) в буфер в памяти и затем обслуживает запросы на чтение из этого буфера до тех пор, пока буфер не будет опустошен. такое поведение чтения больших кусков вместо меньших кусков каждый раз повышает производительность.
  3. это означает, что если Вы не помещаете считыватель в буферизованное считывающее устройство, то каждый раз, когда вы хотите прочитать один символ, он будет обращаться к диск.сеть, чтобы получить только один символ, который вы хотите. выполнение ввода-вывода такими маленькими порциями обычно ужасно для производительности.