BufferedReader против консоли против сканера в Java

BufferedReader против консоли против сканера в Java

1. обзор

В этой статье мы перейдем кwalk through the differences between BufferedReader, Console, and Scanner classes in Java.

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

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

Учитывая базовый поток, переданный конструкторам,both BufferedReader and Scanner classes are able to handle a wider range of user input, например строку, файл, системную консоль (которая обычно подключена к клавиатуре) и сокет.

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

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

BufferedReader br = new BufferedReader(
  new StringReader("Bufferedreader vs Console vs Scanner in Java"));
BufferedReader br = new BufferedReader(
  new FileReader("file.txt"));
BufferedReader br = new BufferedReader(
  new InputStreamReader(System.in))

Socket socket = new Socket(hostName, portNumber);
BufferedReader br =  new BufferedReader(
  new InputStreamReader(socket.getInputStream()));

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

Scanner sc = new Scanner("Bufferedreader vs Console vs Scanner in Java")
Scanner sc = new Scanner(new File("file.txt"));
Scanner sc = new Scanner(System.in);

Socket socket = new Socket(hostName, portNumber);
Scanner sc =  new Scanner(socket.getInputStream());

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

Console console = System.console();

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

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

In contrast to BufferedReader and Scanner classes, which don’t write anything to the output stream, the Console class offers some convenient methods какreadPassword (String fmt, Object… args), readLine (String fmt, Object… args), иprintf (String format,Object… args),to write the prompt to the system console’s output stream:

String firstName = console.readLine("Enter your first name please: ");
console.printf("Welcome " + firstName );

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

4. Разбор ввода

The Scanner class can parse primitive types and strings using regular expressions.

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

String input = "Bufferedreader vs Console vs Scanner";
Scanner sc = new Scanner(input).useDelimiter("\\s*vs\\s*");
System.out.println(sc.next());
System.out.println(sc.next());
System.out.println(sc.next());
sc.close();

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

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

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

String password = String.valueOf(console.readPassword("Password :"));

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

6. Поток Сейф

Все методы чтения вBufferedReader и методы чтения и записи вConsole - этоsynchronized, тогда как методы в классеScanner - нет. If we read the user input in a multi-threaded program, either BufferedReader or Console will be a better option.с

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

The buffer size is 8 KB in BufferedReader as compared to 1 KB in Scanner class.

Кроме того, при необходимости мы можем указать размер буфера в конструкторе классаthe BufferedReader. Это поможет при чтении длинных строк из пользовательского ввода. Console class has no buffer when reading from the system console, но у него есть буферизованный выходной поток для записи в системную консоль.

8. Разнообразный

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

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

После создания экземпляраBufferedReader илиScanner нам потребуетсяremember to close it in order to avoid a memory leak. Но этого не происходит с классомConsole - нам не нужно закрывать системную консоль после использования.

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

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

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

Теперь, когда мы указали различия между этими классами, давайте рассмотрим несколькоrules of thumb regarding which one(s) are best suited to tackle different situations:

  • ИспользуйтеBufferedReader, если нам нужно читать длинные строки из файла, так как он имеет лучшую производительность, чемScanner

  • РассмотримConsole, если мы читаем защищенные данные с системной консоли и хотим скрыть то, что вводится

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

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

  • В потокобезопасном контексте рассмотритеBufferedReader, если нам не нужно использовать функции, специфичные для классаConsole