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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

См. ссылку , после чего цитируется следующее:

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

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

  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:

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

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

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

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

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

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

Ответ 9

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

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

Спасибо

Ответ 10

Отличие между BufferedReader и Сканера:

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

    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();
    

Ответ 11

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

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

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

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

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

За дополнительной информацией обращайтесь:

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

Ответ 12

Ответ ниже берется из Чтение с консоли: JAVA Scanner vs BufferedReader

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

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

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

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

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

Когда следует использовать сканер или буферный ридер?

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

Ответ 13

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

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

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

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

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

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

Ответ 14

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

Ответ 15

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