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

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

260 голосов
/ 09 февраля 2010

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

  • Работает ли Scanner так же хорошо, как BufferedReader?
  • Почему вы бы выбрали Scanner вместо BufferedReader или наоборот?

Ответы [ 12 ]

187 голосов
/ 09 февраля 2010

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

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

169 голосов
/ 09 февраля 2010

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

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

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

См. ссылку , отсюда указано следующее:

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

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

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

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

Выбор использования BufferedReader или сканера зависит от кода вы пишете, если вы пишете простой читатель журнала Buffered читатель адекватен. Однако, если вы пишете сканер XML-парсер это более естественный выбор.

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

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

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

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

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

17 голосов
/ 15 апреля 2011

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

8 голосов
/ 01 октября 2017

Разница между BufferedReader и Сканер заключается в следующем:

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

    BufferedReader

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

    Scanner

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();
    
7 голосов
/ 31 декабря 2016

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

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

Спасибо

6 голосов
/ 30 ноября 2016

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

  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:

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

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

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

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

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

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

3 голосов
/ 16 июня 2015

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

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

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

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

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

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

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

1 голос
/ 01 марта 2014

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

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

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

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

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

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

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

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

...