В каких случаях использовать reader и scanner

Обновлено: 03.07.2024

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

  • Работает Scanner так же хорошо, как BufferedReader ?
  • Почему бы вы выбрали Scanner более BufferedReader или наоборот?
Я обычно также использую сканер для чтения из стандартного в («Scanner in = новый сканер (System.in)» чувствует себя намного чище). Не уверен, что это на самом деле менее эффективно, но поскольку чтение с std in блокирует, я не могу себе представить, что эффективность Scanner будет проблемой.

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

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

BufferedReader синхронизирован, а Scanner - нет, поэтому вам решать. Я знаю, что эта тема старая, но у меня были неоднозначные результаты в операционных системах, использующих BufferedReader, при попытке вырвать содержимое из потоков, предоставляемых Process (т. Е. Захватить выходные данные внешней команды). Как только я изменил свой код, чтобы использовать вместо него Сканер, как отмечено в отдельном ответе , все стало работать согласованно и как ожидалось. @Reuben Но в Scanner конечном счете зависит от чего-то еще для его ввода, который вполне может быть синхронизирован.

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

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

  • Парсинг = интерпретация данного ввода как токенов (частей). Он может возвращать вам определенные части непосредственно как int, string, decimal и т. Д. См. Также все эти nextXxx() методы в Scanner классе.
  • Чтение = немой поток Он возвращает вам все символы, которые вы, в свою очередь, должны вручную проверить, хотите ли вы подобрать или составить что-то полезное. Но если вам все равно не нужно этого делать, тогда чтения достаточно.
Хороший. Спасибо за подсказку буфера. Искал все это время, поскольку родные чтения чрезвычайно дороги. @Asif: parsing = интерпретировать данный ввод как токены (части). Он может возвращать вам определенные части непосредственно как int, string, decimal и т. Д. См. Также все эти методы nextXxx () в классе Scanner. Чтение = немой поток Он возвращает вам все символы, которые вы, в свою очередь, должны вручную проверить, хотите ли вы подобрать или составить что-то полезное. Но если вам все равно не нужно этого делать, тогда чтения достаточно. @BalusC Хорошо, я уже использовал, readInt(); readFloat (); и т. д. Теперь получил, что означает синтаксический анализ. и BalusC, можете ли вы уделить мне немного времени, всего 10 минут в чате, я хочу немного спросить о буферизованном, как это работает. Что я обертываю BufferedReader в конструкторе сканера? Это хорошая идея? Scanner Буфер будет расширен по мере необходимости для сопоставления с образцом. Поэтому, если вам нужен больший буфер, вам нужно только вызвать его, например findWithinHorizon("\\z", 8192) , для него и после него, он будет использовать буфер с емкостью 8192 символов (или весь файл, если он меньше этого).

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

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

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

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

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

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

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

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

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

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

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

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

В этой статье мы рассмотрим различия между классами BufferedReader , Console и Scanner в Java .

Чтобы глубже погрузиться в каждую тему, мы предлагаем ознакомиться с нашими отдельными статьями о Java Scanner, Console I / O in Java и BufferedReader.

2. Пользовательский ввод

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

С другой стороны, класс Console предназначен только для доступа к символьной системной консоли, если таковая имеется, связанной с текущей виртуальной машиной Java.

Давайте посмотрим на конструкторы BufferedReader , которые принимают разные входные данные:

Класс Scanner также может принимать разные входные данные в своих конструкторах:

Класс Console доступен только через вызов метода:

Помните, что когда мы используем класс Console , системная консоль, связанная с JVM, недоступна, если мы запускаем код в среде IDE, такой как Eclipse или IntelliJ IDEA.

3. Пользовательский вывод

В отличие от классов BufferedReader и Scanner , которые ничего не записывают в выходной поток, класс Console предлагает несколько удобных методов, таких как readPassword (String fmt, Object… args), readLine (String fmt, Object… args) и printf ( Формат строки, Object… args) , чтобы записать приглашение в выходной поток системной консоли :

Поэтому, когда мы пишем программу для взаимодействия с системной консолью, класс Console упростит код, удалив ненужный System.out.println .

4. Анализ ввода

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

Он разбивает свой ввод на токены, используя настраиваемый шаблон разделителя, который по умолчанию соответствует пробелам:

Классы BufferredReader и Console просто читают входной поток как есть.

5. Чтение защищенных данных

Класс Console имеет методы readPassword () и readPassword (String fmt , Object… args) для чтения защищенных данных с отключенным эхом, чтобы пользователи не видели, что они вводят:

BufferedReader и Scanner не могут этого сделать.

6. Безопасный поток

Методы чтения в BufferedReader и методов чтения и записи в консоли все синхронизированы , в то время как те , в сканер класса нет. Если мы читаем ввод пользователя в многопоточной программе, лучше использовать BufferedReader или Console .

7. Размер буфера

Размер буфера составляет 8 КБ в BufferedReader по сравнению с 1 КБ в классе Scanner .

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

8. Разное

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

8.1. Закрытие входного потока

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

8.2. Обработка исключений

В то время как Scanner и Console используют подход с неконтролируемыми исключениями, методы в BufferedReader выдают проверенные исключения, что вынуждает нас писать шаблонный синтаксис try-catch для обработки исключений.

9. Заключение

Теперь, когда мы заявили о различиях между этими классами, давайте сформулируем несколько практических правил, определяющих, какие из них лучше всего подходят для решения различных ситуаций :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

выводит следующий вывод:

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

командой bufferedreader:

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

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

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

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

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

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

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

  1. BufferedReader является синхронизироваться но сканер не синхронизируется.
  2. BufferedReader является thread safe но сканер не потокобезопасными.
  3. командой bufferedreader имеет большую буферную память но сканер имеет меньшую буферную память.
  4. командой bufferedreader это быстрее но сканер замедление в исполнении.

код для чтения строки из консоли:

командой bufferedreader:

сканер:

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

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

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

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

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

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

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

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

но, что есть другие отличия?

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

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

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

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

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

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

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

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

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

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

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

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

Как прочитать файл на Java? Мы можем использовать классы ввода-вывода Java для чтения текстовых и двоичных файлов, таких как изображения, pdf и т.д., Используя BufferedReader, FileInputStream.

Существует множество различных способов чтения файла на Java. В этом уроке мы рассмотрим 5 различных способов чтения файла на Java.

Различные способы чтения файла на Java

5 классов из API ввода-вывода Java для чтения файлов:

  1. Буферизатор
  2. Поток ввода файлов
  3. Файлы
  4. Сканер
  5. Случайный файл

Чтение двоичных файлов и текстовых файлов

  • Класс FileInputStream считывает данные файла в поток байтов. Поэтому его следует использовать для двоичных файлов, таких как изображения, pdf, мультимедиа, видео и т.д.
  • Текстовые файлы основаны на символах. Мы можем использовать классы Reader , а также потоковые классы для их чтения.
  • Файлы и классы сканера можно использовать для чтения текстовых файлов, а не двоичных файлов.

Давайте рассмотрим примеры программ для чтения файла на Java.

1. BufferedReader Читает файл

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

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

В приведенной выше программе я печатаю данные файла на консоль. Давайте рассмотрим другой класс утилит для выполнения операций чтения файлов.

  1. Прочитайте полный файл в виде строки
  2. Считывайте файл строка за строкой и возвращайте список строк
  3. Подсчитайте вхождение строки в данный файл.

2. FileInputStream – Считывание двоичных файлов в байты

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

Операция чтения FileInputStream используется с массивом байтов, в то время как операция чтения BufferedReader использует массив символов.

3. Файлы – Чтение файла в список строк

4. Сканер – Считывает текстовый файл в качестве итератора

Мы можем использовать класс сканера для чтения текстового файла. Он работает как итератор

5. RandomAccessFile – Чтение файлов в режиме только для чтения

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

Это все для чтения файла на Java с использованием различных классов из Java IO API.

Читайте также: