Перейти к основному содержимому

System.console() против System.out

· 2 мин. чтения

1. Введение

В этом руководстве мы рассмотрим различия между System.console() и System.out .

2. Система.консоль()

Давайте сначала создадим программу для получения объекта Console :

void printConsoleObject() {
Console console = System.console();
console.writer().print(console);
}

Запуск этой программы из интерактивного терминала выведет что-то вроде java.io.Console@546a03af.

Однако запуск его с других носителей вызовет исключение NullPointerException , поскольку объект консоли будет иметь значение null .

Или, если мы запустим программу, как показано ниже:

$ java ConsoleAndOut > test.txt

тогда программа также выдаст исключение NullPointerException , поскольку мы перенаправляем поток. ``

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

Давайте посмотрим, что в действии:

void readPasswordFromConsole() {
Console console = System.console();
char[] password = console.readPassword("Enter password: ");
console.printf(String.valueOf(password));
}

Это запросит пароль, и он не будет отображать символы, пока мы его набираем.

3. Системный выход

Давайте теперь распечатаем объект System.out :

System.out.println(System.out);

Это вернет что-то вроде java.io.PrintStream.

Вывод будет одинаковым из любого места.

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

Мы можем запустить программу как:

$ java ConsoleAndOut > test.txt

Это напечатает вывод в файл test.txt .

4. Отличия

На примере примеров можно выделить некоторые отличия:

  • System.console() возвращает экземпляр java.io.Console , когда он запускается из интерактивного терминала — с другой стороны , System.out возвращает объект java.io.PrintStream независимо от среды вызова.
  • Поведение System.out и System.console() аналогично, если мы не перенаправляли какие-либо потоки; в противном случае System.console() возвращает null
  • Когда несколько потоков запрашивают ввод, консоль красиво ставит эти запросы в очередь, тогда как в случае System.out все запросы появляются одновременно.

5. Вывод

В этой статье мы узнали о различиях между System.console() и System.out . Мы объяснили, что Консоль полезна, когда приложение должно запускаться из интерактивной консоли, но у нее есть некоторые особенности, которые следует учитывать и учитывать.

Как всегда, полный код для этой статьи доступен на GitHub .