Вопрос

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

  • Делает Scanner выполняет так же хорошо, как BufferedReader?
  • Почему вы выбрали именно это Scanner закончился BufferedReader или наоборот?
Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

  4. Scanner скрывает IOException, пока BufferedReader бросает сразу.

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

Разница между БуферизованныйReader и Сканер следующие:

  1. BufferedReader — это синхронизированный но сканер не синхронизировано.
  2. BufferedReader — это потокобезопасный но сканер не потокобезопасный.
  3. БуферизованныйReader имеет больший объем буферной памяти но сканер имеет меньший объем буферной памяти.
  4. BufferedReader — это Быстрее но сканер медленнее в исполнении.
  5. Код для чтения строки из консоли:

    БуферизованныйReader:

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

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

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

Спасибо

Основные различия:

  1. Сканер

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

Пример

 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. БуферизованныйЧитатель:

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

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

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

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

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

Источник:Связь

Существуют разные способы ввода данных в Java, например:

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

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

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

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

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

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

Ответ ниже взят из Чтение из консоли:JAVA-сканер против BufferedReader

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top