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

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

  • Выполняется ли Scanner так же, как и BufferedReader ?
  • Почему вы выбираете Scanner over BufferedReader или наоборот?

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

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

В последней версии JDK6 release / сборки (b27) у Scanner есть меньший буфер ( 1024 символа ) в отличие от BufferedReader ( 8192 символов ), но его более чем достаточно.

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

  • Parsing = интерпретация данного ввода как токенов (частей). Он может возвращать вам определенные части непосредственно как int, string, decimal и т. Д. См. Также все эти nextXxx() в classе Scanner .
  • Чтение = немой stream. Он продолжает выдавать вам всех персонажей, которые вам, в свою очередь, придется вручную проверять, хотите ли вы совместить или составить что-то полезное. Но если вам все равно не нужно это делать, то чтение достаточно.

См. Эту ссылку , следующая цитата:

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

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

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

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

Выбор использования BufferedReader или сканера зависит от кода, который вы пишете, если вы пишете простую программу чтения журнала. Буферизованный читатель является адекватным. Однако, если вы пишете XML-синтаксический анализатор, более естественным является выбор Scanner.

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

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

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

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

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

Я предлагаю использовать BufferedReader для чтения текста. Scanner скрывает IOException то время как BufferedReader выдает его немедленно.

  • BufferedReader синхронно, а Scanner – нет.
  • BufferedReader следует использовать, если мы работаем с несколькими streamами.
  • BufferedReader имеет значительно большую буферную память, чем Scanner .
  • Scanner имеет небольшой буфер (1KB char buffer) в отличие от BufferedReader (буфер с байтом 8 Кбайт), но этого более чем достаточно.
  • BufferedReader немного быстрее по сравнению со Scanner потому что Scanner выполняет синтаксический анализ входных данных, и BufferedReader просто считывает последовательность символов.

================================================== ======================

Класс Scanner является дополнением к classу Formater (используется для преобразования двоичных данных в форматированный текст). Сканер считывает форматированный ввод и преобразует его в свою двоичную форму. Несмотря на то, что всегда можно было читать форматированный ввод, требуется больше усилий, чем это предпочло бы большинству программистов. Из-за добавления Сканера теперь легко читать все типы числовых значений, строк и других типов данных, независимо от того, поступают они из файла диска, клавиатуры или другого источника. Сканер может использоваться для чтения ввода с консоли, файла, строки или любого другого источника, который реализует интерфейс Readable или ReadableByteChannel. Например, вы можете использовать Scanner для чтения номера с клавиатуры и назначения его значения переменной.

BufferedReader , с другой стороны, является classом ввода-вывода символьного streamа. Потоки символов обеспечивают удобный способ ввода и вывода в терминах символов (Unicode). BufferedReader в основном используется для ввода ввода с консоли System.in . В качестве аргумента требуется объект InputStreamReader .

Основные отличия:

  1. сканер

  • Простой текстовый сканер, который может анализировать примитивные типы и строки с использованием регулярных выражений.
  • Сканер разбивает свой ввод на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу. Затем полученные маркеры могут быть преобразованы в значения разных типов с использованием различных следующих методов.

пример

  String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close(); 

выводит следующий результат:

  1 2 red blue 

Тот же вывод может быть сгенерирован с помощью этого кода, который использует регулярное выражение для одновременного анализа всех четырех токенов:

  String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input); s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)"); MatchResult result = s.match(); for (int i=1; i<=result.groupCount(); i++) System.out.println(result.group(i)); s.close(); ` 


  1. BufferedReader:

    • Читает текст из streamа ввода символов, буферизуя символы, чтобы обеспечить эффективное считывание символов, массивов и строк.

    • Можно указать размер буфера или использовать размер по умолчанию. Значение по умолчанию достаточно велико для большинства целей.

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

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

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

Источник: ссылка

Ниже приведены различия между BufferedReader и Scanner

  1. BufferedReader только считывает данные, но сканер также анализирует данные.
  2. вы можете читать String только с помощью BufferedReader, но вы можете читать int, long или float с помощью Scanner.
  3. BufferedReader старше Сканера, он существует из jdk 1.1, в то время как Scanner был добавлен в выпуск JDK 5.
  4. Размер буфера BufferedReader большой (8 КБ) по сравнению с 1 КБ сканера.
  5. BufferedReader более подходит для чтения файла с длинной строкой, тогда как сканер более подходит для чтения небольших пользовательских ввода из командной строки.
  6. BufferedReader синхронизирован, но Scanner – нет, что означает, что вы не можете делиться сканером между несколькими streamами.
  7. BufferedReader быстрее, чем сканер, потому что он не тратил время на parsing
  8. BufferedReader немного быстрее по сравнению со сканером
  9. BufferedReader – это пакет java.io, а сканер – из пакета java.util на основе точек, которые мы можем выбрать.

благодаря

Разница между BufferedReader и Scanner следующая:

  1. BufferedReader синхронизирован, но сканер не синхронизирован .
  2. BufferedReader является streamобезопасным, но сканер не является streamобезопасным .
  3. BufferedReader имеет большую буферную память, но у Scanner меньше буферная память .
  4. BufferedReader работает быстрее, но сканер работает медленнее .
  5. Код для чтения строки с консоли:

    BufferedReader :

      InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br= new BufferedReader(isr); String st= br.readLine(); 

    Сканер :

     Scanner sc= new Scanner(System.in); String st= sc.nextLine(); 

Существуют различные способы ввода ввода в java:

1) BufferedReader 2) Сканер 3) Аргументы командной строки

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

Где Сканер представляет собой простой текстовый сканер, который может анализировать примитивные типы и строки с использованием регулярных выражений.

если вы пишете простой бланк для чтения. Буферизованный читатель является адекватным. если вы пишете XML-синтаксический анализатор, более естественным является выбор Scanner.

Для получения дополнительной информации см.:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69

Ответ ниже берется из Read from Console: JAVA Scanner vs BufferedReader

Когда вы читаете ввод с консоли, для этого есть два варианта. Сначала используется Scanner , другой – BufferedReader . Оба они имеют разные характеристики. Это означает различия, как использовать его.

Сканер обрабатывал данный вход как токен. BufferedReader просто читает строки за строкой, данные вводятся как строка. Сканер сам обеспечивает возможности синтаксического анализа, как nextInt (), nextFloat ().

Но что между ними различия между людьми?

  • Сканер обрабатывал данный вход как токен. BufferedReader как строка streamа / строка
  • Scanner tokenized заданный ввод с использованием regex. Использование BufferedReader должно написать дополнительный код
  • BufferedReader быстрее, чем сканер * point no. 2
  • Сканер не синхронизирован, BufferedReader синхронизирован

Сканер поставляется с версии JDK версии 1.5 выше.

Когда следует использовать Scanner или Buffered Reader?

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

Листинг несколько …

java.util.Scanner class – это простой текстовый сканер, который может анализировать примитивные типы и строки. Он внутренне использует регулярные выражения для чтения разных типов.

Класс Java.io.BufferedReader считывает текст из streamа ввода символов, буферизуя символы, чтобы обеспечить эффективное считывание последовательности символов

1) BufferedReader является синхронным, а Scanner – нет. BufferedReader следует использовать, если мы работаем с несколькими streamами.

2) BufferedReader имеет значительно большую буферную память, чем Scanner . Scanner имеет небольшой буфер (1KB char buffer) в отличие от BufferedReader (буфер с байтом 8 Кбайт), но этого более чем достаточно.

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

  1. BufferedReader, вероятно, даст вам лучшую производительность (поскольку Scanner основан на InputStreamReader, посмотрите источники). ups, для чтения из файлов он использует nio. Когда я тестировал производительность nio против производительности BufferedReader для больших файлов, nio показывает немного лучшую производительность.
  2. Для чтения из файла попробуйте Apache Commons IO.

Я предпочитаю Scanner потому что он не выбрал проверенные исключения, и поэтому его использование приводит к более упорядоченному коду.

  • Прочтите .txt-файл в 2D-массив
  • Исключение в streamе "main" java.io.FileNotFoundException: Ошибка
  • Как использовать java.util.Scanner, чтобы правильно читать данные пользователя из System.in и действовать на него?
  • Закрыть сканер, связанный с System.in
  • Как использовать .nextInt () и hasNextInt () в цикле while
  • Как заставить сканер отбрасывать исключения при вводе неправильного типа?
  • Закрыть сканер без закрытия System.in
  • Многочисленные сканеры Java
  • Исключение в streamе "main" java.util.NoSuchElementException
  • Извлечь целочисленную часть в строке
  • Java: бесконечный цикл с использованием Scanner in.hasNextInt ()
  • Давайте будем гением компьютера.