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


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

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

15 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4. Scanner скрывает IOException while BufferedReader сразу же бросает его.

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

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

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

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

BufferedReader, С другой стороны, это класс ввода-вывода потока символов. Символьные потоки обеспечивают удобный способ ввода и вывода в терминах символов (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:

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

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

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

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

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

источник:ссылке

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

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

спасибо

разницу между BufferedReader и сканер следующие:

  1. BufferedReader is синхронизироваться но сканер не синхронизируется.
  2. BufferedReader is потокобезопасным но сканер не потокобезопасными.
  3. BufferedReader имеет большую буферную память но сканер имеет меньшую буферную память.
  4. BufferedReader is быстрее но сканер замедление в исполнении.
  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 считывает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное чтение символов, массивов и строк.

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

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

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

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

ответ ниже взят из чтение из консоли: Java Scanner vs BufferedReader

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

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

но, что такое другие различия между ними?

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

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

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

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

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

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

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

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

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

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

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

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