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

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

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

12 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо

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

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

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

  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.

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

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

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

Есть разные способы ввода данных в Java, такие как:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Список немногих...

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

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

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

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

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

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

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

Другие вопросы по тегам