Что ожидает конструктор BufferedReader от FileReader - PullRequest
6 голосов
/ 01 декабря 2011

Мне нужно понять разницу между этими двумя классами и тем, как они работают друг с другом.Я понимаю, что FileReader читает символы из файла по одному символу за раз, а BufferedReader читает большой кусок данных и сохраняет их в буфере, что делает его быстрее.

Чтобы использовать BufferedReader, я должен предоставить ему FileReader.Как класс BufferedReader использует FileReader, если он читает файл по-другому?Означает ли это, что BufferedReader использует FileReader и, следовательно, за кадром символы по-прежнему читаются по одному символу за раз?Я предполагаю, что мой вопрос в том, как класс BufferedReader использует класс FileReader.

Ответы [ 4 ]

6 голосов
/ 01 декабря 2011

BufferedReader использует метод FileReader.read(char[] cbuf, int off, int len), который вы также можете прочитать, если хотите получить более одного символа за раз.

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

5 голосов
/ 01 декабря 2011

Прежде всего, BufferedReader принимает Reader, а не FileReader (хотя последнее принимается).

В абстрактном классе Reader имеется несколько read() методов.Существует версия для чтения одного символа, а также две версии, которые читают блок символов в массив.

Имеет смысл использовать BufferedReader, только если вы читаете отдельные символы или небольшие блоки ввремя.

Рассмотрим следующие два запроса:

char ch1 = fileReader.read();
char ch2 = bufferedReader.read()

Первый пойдет в базовый файл, тогда как второй, скорее всего, будет удовлетворен из BufferedReader.внутренний буфер.

2 голосов
/ 01 декабря 2011

BufferedReader добавляет слой буферизации поверх любого считывателя. Смысл в том, чтобы сделать чтение более оптимальным по сравнению с чтением файла, сокета или чего-то небуферизованным способом. Он также добавляет несколько удобных методов, которые не сработали бы очень хорошо, если бы он не выбрал для вас чанк. В случае FileReader, вы должны прочитать часть данных, пока не найдете '\ n', чтобы иметь возможность сделать что-то вроде BufferedReader.readLine (), а затем вам придется сохранить оставшиеся данные для следующей операции чтения (не говоря уже о работе, необходимой, когда вам приходится ждать медленного источника данных, чтобы доставить все это вам).

2 голосов
/ 01 декабря 2011

FileReader имеет возможность читать куски, а не только 1 символ за раз.Он наследует методы read (char []) от Reader, поэтому вы можете читать до размера передаваемого вами массива char []. BufferedReader просто оборачивает FileReader, поэтому при вызове методов read () в BufferedReader, он обрабатывает буферы внутри и вызывает методы read () в своем базовом Reader.Одна из главных причин, по которой вы используете BufferedReader, заключается в том, что вы можете использовать метод readLine ().BufferedReader может обернуть другие читатели, кроме FileReader (например, InputStreamReader).

...