Есть ли у сканера буфер Java

Обновлено: 03.07.2024

Многим разработчикам Java не хватает навыков ввода-вывода Java. Вы должны ответить хотя бы на основные вопросы, связанные с вводом-выводом Java, которые часто задают на собеседовании разработчика Java. Один из таких вопросов — разница между BufferedReader и Scanner в java. В этом руководстве я расскажу о различиях между BufferedReader и Scanner и приведу примеры BufferedReader и Scanner.

8 Различия между BufferedReader и Scanner в Java

1.Буферная память: BufferedReader имеет большую буферную память (8 КБ или 8192 символа), чем сканер (1 КБ или 1024 символа). Это означает, что если вы читаете большую строку, вам следует использовать BufferedReader. Если пользовательский ввод короткий или отличается от строки, вы можете использовать сканер.

<р>2. Функциональность: BufferedReader используется только для чтения данных. Сканер не только читает данные, но и анализирует данные.

Сканер использует регулярное выражение для чтения и анализа текста. Он может использовать настраиваемый разделитель и анализировать текст в примитивный тип данных, например, для коротких, длинных, int, используя методы nextShort(), nextLong(), nextInt(). BufferedReader может только читать String с помощью метода readLine().

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

<р>4. Тип данных: BufferedReader может читать только String. Сканер может читать String, а также примитивные типы данных (int, float, double, long, short).

5. Знакомство с JDK: BufferedReader появился в JDK 1.1, а Scanner — в JDK1.5.

6. Синхронизация: BufferedReader синхронизируется, а Scanner — нет. Для многопоточных приложений предпочтительнее BufferedReader.

7. Checked Exception: BufferedReader выдает CheckedException (т.е. IOException), в то время как Scanner не выдает никаких CheckedException.

<р>8. Пакет: класс BufferedReader присутствует в пакете java.io, а класс Scanner присутствует в пакете java.util.

Примеры классов BufferedReader и Scanner в Java

Пример BufferedReader, принимающий пользовательский ввод с консоли.

Вывод:
Введите название блога:
JavaHungry
Привет, JavaHungry

Пример сканера, принимающего пользовательский ввод из консоли.

Вывод:
Введите название блога:
JavaHungry
Привет, JavaHungry
Введите пол М/Ж:
М
Введите случайное целое число:
>10
Введите номер рулона. :
01711015
Сканер используется для чтения пользовательского ввода
пол : M
randomInteger : 10
номер : 01711015

Как видно из примера со сканером, он может считывать как строковые, так и числовые данные из командной строки.

Резюме: разница между BufferedReader и Scanner в Java

BufferedReaderСканер
Буферная памятьБольшой буфер( 8 КБ) Небольшой буфер (1 КБ)
ФункциональностьТолько чтение данных Чтение и анализ данных
ПроизводительностьБыстрееМедленнее
Тип данных чтение только строкичтение строки, а также примитивного типа данных
Введение в jdk Начиная с jdk 1.1Начиная с jdk 1.5
СинхронизацияДаНет
CheckedExceptionВыдает IOExceptionНет
Пакетjava.io java.util

В этой статье я продемонстрировал разницу между BufferedReader и Scanner вместе с примерами. Вы можете использовать BufferedReader, когда ввод большой и имеет тип данных String. Используйте Scanner, если ввод небольшой или имеет примитивный тип данных (int, float, long, double). Пожалуйста, укажите в комментариях, если у вас есть какие-либо вопросы относительно BufferedReader или Scanner.

Об авторе

Субхам Миттал проработал в Oracle 3 года.
Понравился этот пост? Чтобы не пропустить будущие публикации, подпишитесь на JavaHungry

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

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


Обычно я также использую Scanner для чтения из стандартного in ('Scanner in = new Scanner(System.in)' выглядит намного чище). Не уверен, что это на самом деле менее эффективно, но поскольку чтение из стандартного ввода блокируется, я не могу представить, что эффективность сканера может быть проблемой.

12 ответов 12

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

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



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

@Reuben Но Scanner в конечном счете зависит от чего-то еще для ввода данных, которое вполне может быть синхронизировано.

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

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

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

Хороший. Спасибо за подсказку с буфером. Искал его все время, так как нативное чтение очень дорого.

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

@BalusC Хорошо, я уже использовал, readInt(); читать с плавающей запятой(); и т.д. Теперь понял, что значит разбор. и BalusC, не могли бы вы уделить мне немного времени, всего 10 минут в чате, я хочу немного спросить о буферизации, как она работает.

Буфер сканера будет расширен по мере необходимости для сопоставления с образцом. Поэтому, если вам нужен буфер большего размера, вам нужно только вызвать, например. findWithinHorizon("\\z", 8192) , на нем и далее будет использоваться буфер емкостью 8192 символа (или весь файл, если он меньше).

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

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

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

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

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

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

Привет, ребята, добро пожаловать в мой блог. Сегодня мы обсудим еще один интересный вопрос из интервью по Java, BufferedReader vs Scanner. Это важно не только с точки зрения собеседования, но и для эффективной работы с Java. Несмотря на то, что и BufferedReader, и Scanner могут читать файл или пользовательский ввод из командной строки в Java, между ними есть некоторые существенные различия.Одно из основных различий между классами BufferedReader и Scanner заключается в том, что первый класс предназначен только для чтения строковых или текстовых данных, в то время как класс Scanner предназначен для чтения и анализа текстовых данных в примитивные типы Java, такие как int, short, float, double, и долго.

Другими словами, BufferedRedaer может читать только String, но Scanner может читать как String, так и другие типы данных, такие как int, float, long, double, float и т. п. Это функциональное различие приводит к ряду других различий в их использовании, которые мы рассмотрим в этой статье.

Еще одно отличие состоит в том, что Scanner новее BufferedReader и представлен только в Java 5, а BufferedReader присутствует в Java начиная с версии JDK 1.1. Это означает, что у вас есть доступ к BufferedReader почти во всех версиях JDK, в основном в Java 1.4, но Scanner доступен только после Java 5.

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

В этой статье вы узнаете не только об этих ключевых различиях между BufferedReader и Scanner, но и о том, как использовать их в программе Java. Кстати, если вы новичок в мире разработки Java, я предлагаю вам сначала начать с всеобъемлющего курса, такого как Полный мастер-класс по Java на Udemy.

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

1. BufferedReader и сканер в Java

В любом случае, вернемся к теме.

Вот 5 основных различий между классами Scanner и BufferedReader Java API:

<р>1. Сканер — гораздо более мощная утилита, чем BufferedReader. Он может анализировать пользовательский ввод и читать int, short, byte, float, long и double, кроме String. С другой стороны, BufferedReader может только читать String в Java.

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

<р>3. BufferedReader старше Scanner. Он присутствует в Java, начиная с JDK 1.1 и выше, но Scanner представлен только в версии JDK 1.5.

<р>4. Сканер использует регулярное выражение для чтения и анализа ввода текста. Он может принимать пользовательский разделитель и анализировать текст в примитивный тип данных, например. int, long, short, float или double с использованием методов nextInt() , nextLong() , nextShort() , nextFloat() и nextDouble(), в то время как BufferedReader может только читать и сохранять String с помощью метода readLine().

<р>5. Еще одно важное различие между классом BufferedReader и Scanner заключается в том, что BufferedReader синхронизируется, а Scanner — нет. Это означает, что вы не можете совместно использовать Scanner между несколькими потоками, но вы можете совместно использовать объект BufferedReader.

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

2. Пример сканера и BufferedReader на Java

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

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

Хотя это не ограничение, и вы даже можете прочитать файл с помощью Scanner в Java. Кроме того, вы даже можете прочитать файл всего одной строкой кода в Java 8.

Если вам нравятся книги, вы также можете прочитать Core Java Volume 2 — Advanced Features by Cay S. Horstmann, чтобы узнать больше об основах Java IO. Это одна из ключевых областей основного программирования Java, которая отличает Java-разработчика среднего уровня от опытного.

2. 1 Java-программа для использования Scanner и BufferedReader

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

Вот краткое изложение всех различий между Scanner и BufferedReader в Java:

Сканер и BufferedReader в Java

Это все, что касается различий между классами Scanner и BufferedReader в Java.Несмотря на то, что оба они способны считывать пользовательский ввод с консоли, вам следует использовать Scanner, если ввод невелик, и вы также хотите читать различные типы ввода, такие как int, float и String. Используйте BufferedReader, если вы хотите прочитать текст без разбора. Поскольку он имеет больший буфер, вы также можете использовать его для чтения длинных строк в Java.

  • 2 способа прочитать текстовый файл в Java? (решение)
  • Как читать файл Excel в Java? (решение)
  • Как прочитать файл CSV в Java? (пример)
  • Как создать файл и каталог в Java? (ответ)
  • Как прочитать файл XML в Java? (ответ)
  • Как добавить текст в существующий файл в Java? (пример)
  • 5 бесплатных курсов по Java 8 и Java 9 для программистов (курсы)
  • 5 бесплатных курсов по структуре данных и алгоритмам (курсы)
  • 5 бесплатных курсов по изучению Spring Core и Spring Boot для разработчиков Java (курсы)
  • 10 советов, как стать лучшим разработчиком Java (советы)

Спасибо, что прочитали это руководство. Если вам понравился этот урок, поделитесь им с друзьями и коллегами. Если у вас есть какие-либо вопросы или отзывы, пожалуйста, напишите об этом. Если вы хотите оставаться на связи, подписывайтесь на меня в Твиттере, мой идентификатор — javinpaul.

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

Как мы знаем, Java — это объектно-ориентированный язык программирования; следовательно, все структурировано или упаковано в объекты и классы. В отличие от C или C++, в Java нет cin и scanf() для получения ввода от пользователя в командной строке (консоли). Тем не менее, в Java есть несколько методов ввода, таких как класс Scanner, класс BufferedReader, аргумент командной строки и класс консоли.

Сначала давайте рассмотрим существенные различия между классами чтения буферов и сканеров в Java. После этого мы изучим остальные методы ввода. Эти классы принадлежат пакетам java.util и java.io.

Приготовьтесь принимать данные с консоли!


Класс сканера в Java

Класс Scanner – это встроенный в Java класс, который позволяет пользователю вводить данные с консоли. Он был введен теоретически в версии K 1.5 и выше. Как следует из названия, класс сканера сканирует каждую строку в чем-либо. Это может быть консоль или ввод в качестве аргумента.

Класс Scanner сканирует примитивные типы данных, такие как int, float, long, double, short и byte. Многие программисты считают этот способ наиболее простым среди всех остальных методов.

java.util.Scanner — это пакет API Java, используемый для создания объекта Scanner. Он генерирует InputMismatchException, если ввод не соответствует ожидаемому типу данных. Поместите свой код в блок try and catch, чтобы проверить ввод пользователя.

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

Здесь sc — имя нашего объекта, и оно может быть любым. В классе Scanner находится множество методов. Давайте обсудим их один за другим.

Примечание:

  • Обязательно импортируйте пакет java.util.Scanner в свою программу, прежде чем создавать объект Scanner; в противном случае вы столкнетесь с ошибками времени компиляции.
  • Поскольку язык Java чувствителен к регистру, убедитесь, что вы правильно пишете ключевые слова.

Методы класса сканера

Как мы узнали выше, Scanner сканирует примитивные типы, такие как int, float, short и т. д.

Для каждого типа данных существуют встроенные методы. Класс сканера содержит другие методы, которые помогают принимать входные данные. Хотя наряду с достоинствами у Scanner Class есть и недостатки. Мы обсудим это позже в этом уроке.

Использование класса сканера

Вывод:

МетодОписание
public String next() он возвращает следующий токен из класса сканера.
public String nextLine()он перемещает позицию сканера на следующую строку и возвращает значение как строка
открытый байт nextByte()он читает следующий токен как байт.
public int nextInt()читает следующий токен как целое.
public float nextFloat()читает следующий токен как число с плавающей запятой.
public short nextShort()он читает следующий токен как короткий.
public long nextLong()он читает следующий токен как длинный.
public double nextDouble()он читает следующий токен как double.
public boolean nextBoolean()считывает логическое значение.

Другие способы ввода

Как видите, мы еще не вводили строку. Давайте возьмем это сейчас, и есть важная вещь, на которую следует обратить внимание.

Ввод строки может быть быстро получен от пользователя, если буфер свободен, т. е. в самом начале кода имеется только ввод строки. Но что, если нет? Если перед строковым методом есть какой-либо другой метод, который может быть nextInt(), nextFloat() или любым методом nextXxx(), то nextLine() будет пропущен.

Это главный недостаток Scanner Class. Это не относится к классу BufferedReader. Это существенная разница между классом чтения буфера и сканером в Java.

Пояснение с использованием кода

Проблема в том, что после ввода числового значения первый sc.nextLine() пропускается, а второй sc.nextLine() выполняется, как показано в приведенном выше выводе. Это связано с тем, что метод sc.nextInt() не считывает символ перевода строки в вашем вводе, созданном нажатием «Enter», и поэтому вызов sc.nextLine() возвращается после прочтения этого перевода строки. .

Вы столкнетесь с аналогичным поведением при использовании sc.nextLine() после sc..next() или любого метода sc.nextXxx() (кроме самого nextLine()).

Либо поместите вызов sc.nextLine() после каждого sc.nextInt() или sc.nextFoo, чтобы использовать оставшуюся часть этой строки, включая новую строку

Или, что еще лучше, прочитайте ввод с помощью sc.nextLine() и преобразуйте ввод в нужный формат. Например, вы можете преобразовать в целое число, используя метод Integer.parseInt(String). Это вызовет исключение NumberFormatException.

Пояснение с использованием кода

Класс BufferedReader в Java

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

Он появился в Java, начиная с версии jdk 1.1. Используя readLine(), он считывает данные построчно. Это делает производительность быстрой. Соответственно, он наследует класс Reader, если вы хотите прочитать данные из файла.

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

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

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

Конструкторы в классе BufferedReader

  • BufferedReader(Reader in): создает буферизованный поток ввода символов, который использует входной буфер размера по умолчанию.
  • BufferedReader(Reader in, int size): создает буферизованный поток ввода символов, который использует входной буфер указанного размера.

Методы класса BufferedReader

  • readLine() выдает IOException: readLine() читает строку текста. Строка считается завершенной одним из следующих символов: перевод строки ('\n'), возврат каретки ('\r'), возврат каретки, за которым сразу следует перевод строки, r при достижении конца файла (ЕОФ).
  • read() генерирует исключение IOException: read() возвращает считанный символ как целое число в диапазоне от 0 до 65 535 или -1, если достигнут конец потока.

Ввод строки из консоли

Как обсуждалось выше, BufferedReader не имеет встроенных методов для получения каких-либо других входных данных, кроме строки. Мы можем проанализировать ввод String в требуемый тип. Вы можете обратиться к приведенной ниже реализации, чтобы понять концепцию класса считывателя буфера и сканера в java.

Примечание. При синтаксическом анализе будет выдано исключение NumberFormatException. Поэтому используйте блок try-catch или используйте ключевое слово throws сразу после основного метода, как в приведенном выше примере.

Источник изображения: Google

Класс BufferReader и Scanner в Java

Класс сканераКласс BufferedReader
Класс сканера не является синхронным и не поддерживает потоки.< /td>Класс BufferedReader является синхронным и широко используется с несколькими потоками.
Сканер разбивает входные данные на токены, используя шаблон разделителя. BufferedReader просто считывает последовательность символов в той части, которая зависит от размера буфера.
Сканер имеет небольшой буфер (1 КБ байтового буфера).У него значительно больше буферной памяти, чем у сканера. (8 КБ байтового буфера)
Сканер работает медленно, поскольку анализирует входные данные. Более того, он скрывает IOException.В отличие от Scanner, BufferedReader просто считывает последовательность символов. Следовательно, он быстрее, чем класс сканера. Выдает исключение IOException.

Когда использовать класс Scanner и класс BufferedReader?

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

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

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

Часто задаваемые вопросы

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

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

A BufferedReader — это класс, помогающий эффективно читать базовый поток.

В отличие от класса BufferedReader, он анализирует входные данные. Следовательно, он медленный по сравнению с BufferedReader.

Метод nextLine() — это встроенный метод, находящийся в классе сканера; он сдвигает позицию сканера на следующую строку и возвращает значение в виде строки.

Ключевые выводы

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

Существенная разница между ними заключается в размере буфера. Независимо от размера буфера сканер выполняет синтаксический анализ примитивных типов.

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

Чтобы узнать больше о методах ввода, обратитесь к нашей статье "Знание Java для вашей первой работы по программированию".

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