«1. Введение

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

2. System.console()

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

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

Запуск этой программы из интерактивного терминала выведет что-то вроде [email protected]

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

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


$ 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:

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.