Scanner vs BufferedReader в Java: сравнение производительности

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для непосредственного считывания примитивов предпочтительнее использовать Scanner с помощью методов nextInt() и nextDouble():

Java
Скопировать код
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();

Если ваша задача – обработка больших объемов текста с высокой производительностью, следует выбрать BufferedReader, использующий метод readLine():

Java
Скопировать код
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();

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

Кинга Идем в IT: пошаговый план для смены профессии

Выбор в зависимости от выполнения задач

Когда применять Scanner?

  • Интерактивные приложения: если основой является умеренный ввод данных и их последующая обработка.
  • Файлы с разделителями: Scanner отлично подходит для работы с данными в формате CSV.
  • Чистый и удобочитаемый код: в случаях, когда простота и компактность кода важнее, чем скорость выполнения операций.

В каких случаях выигрывает BufferedReader?

  • Массовое чтение файлов: когда центральным аспектом является скорость обработки больших данных.
  • Обработка лог-файлов: эффективность BufferedReader делает его незаменимым при построчном чтении.
  • Многопоточные приложения: синхронизация BufferedReader обеспечивает его корректную работу в многопоточной среде.

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

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

В контексте API, Scanner предлагает богатый спектр методов парсинга nextXxx(), в отличие от сравнительно простых методов чтения ограниченного набора методов BufferedReader. Однако последний обгоняет первого по показателям производительности.

Показания производительности и их основы

Размер буфера и его назначение

  • Scanner: Имеет меньший размер буфера (1024 символа), что может стать препятствием при работе с задачами, требующими большого обмена данными.
  • BufferedReader: Большой буфер (8192 символа) делает его идеальным выбором для обработки больших объемов данных.

Парсинг и чтение – как сделать правильный выбор?

  • Парсинг со Scanner'ом: Простое и удобное решение, которое, однако, может понизить производительность из-за дополнительных затрат.
  • Чтение с BufferedReader'ом: Гарантирует высокую скорость за счет минимальистичности.

Визуализация

Сравните Scanner и BufferedReader, представив их как методы доставки воды:

МетодДоставка воды
Scanner🚰🛁 Порционное наполнение
BufferedReader💧🌊 Непрерывное наполнение

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

Markdown
Скопировать код
🚰 ➡️ 🥤 ➡️ 🥤 ➡️ (множество попыток, небольшие объемы)

BufferedReader — лучший выбор для масштабных, сложных задач.

Markdown
Скопировать код
💧 ➡️🌊 (одна попытка, большой объем)

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

Уточнение выбора инструмента

Настраиваемость:

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

Многопоточность:

  • Scanner: Неприменим для выполнения многопоточных операций из-за отсутствия синхронизации.
  • BufferedReader: Поддерживает синхронизацию, что незаменимо для работы в многопоточных приложениях.

Структурированные данные и командная строка:

  • Scanner: Успешно справляется с парсингом данных в форматах XML и JSON.
  • Scanner: Обеспечивает эффективное чтение аргументов из командной строки.

Полезные материалы

  1. Java Scanner | Baeldung — Описание класса Scanner в Java.
  2. Scanner (Java Platform SE 8) — Официальная документация Oracle по Scanner.
  3. BufferedReader (Java Platform SE 8) — Официальная документация Oracle по BufferedReader.
  4. Java BufferedReader — Детальное руководство по использованию BufferedReader в Java IO.
  5. Educative: Interactive Courses for Software Developers — Обзор класса Scanner в Java.
  6. Руководство | DigitalOcean — Простое объяснение работы класса BufferedReader в Java.