Вопрос-ответ

Scanner vs. BufferedReader

Сканер против BufferedReader

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

Мои вопросы таковы:


  • Scanner Работает ли так же хорошо, как BufferedReader?

  • Почему вы выбрали Scanner over BufferedReader или наоборот?

Переведено автоматически
Ответ 1

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

На самом деле вы можете передать a BufferedReader в a scanner в качестве источника символов для синтаксического анализа.

Ответ 2

В последней на данный момент версии / сборке JDK 18 (b37) Scanner имеет буфер меньшего размера (1024 символа) в отличие от BufferedReader (8192 символа), но этого более чем достаточно.

Что касается выбора, используйте Scanner если вы хотите разобрать файл, используйте BufferedReader если вы хотите прочитать файл построчно. Также ознакомьтесь с вводным текстом их вышеупомянутой документации по API.


  • Синтаксический анализ = интерпретация заданных входных данных как токенов (частей). Он может возвращать вам определенные части непосредственно в виде int, string, decimal и т.д. Смотрите также все эти nextXxx() методы в Scanner классе.

  • Чтение = тупая потоковая передача. Он продолжает возвращать вам все символы, которые вам, в свою очередь, приходится проверять вручную, если вы хотите сопоставить или составить что-то полезное. Но если вам все равно не нужно этого делать, тогда достаточно чтения.

Ответ 3

Смотрите эту ссылку, оттуда цитируется следующее:


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


BufferedReader синхронизирован, поэтому операции чтения в BufferedReader можно безопасно выполнять из нескольких потоков.


С другой стороны, в сканер встроено гораздо больше возможностей; он может делать все, что может BufferedReader, и при этом с тем же уровнем эффективности. Однако, кроме того, сканер может анализировать базовый поток на наличие примитивных типов и строк с помощью регулярных выражений. Он также может маркировать базовый поток разделителем по вашему выбору. Он также может выполнять прямое сканирование базового потока без учета разделителя!


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


Выбор использования BufferedReader или сканера зависит от кода, который вы пишете, если вы пишете простой log Reader, Buffered reader подойдет. Однако, если вы пишете анализатор XML, сканер является более естественным выбором.


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


Ответ 4

  1. BufferedReader имеет значительно большую буферную память, чем Scanner. Используйте, BufferedReader если вы хотите получать длинные строки из потока, и используйте, Scanner если вы хотите проанализировать определенный тип токена из потока.


  2. Scanner может использовать tokenize с использованием пользовательского разделителя и разбивать поток на примитивные типы данных, в то время как BufferedReader может только читать и сохранять String.


  3. BufferedReader работает синхронно, а Scanner нет. Используйте BufferedReader, если вы работаете с несколькими потоками.


  4. Scanner скрывает исключение IOException, в то время как BufferedReader выдает его немедленно.


java