System.console () срещу System.out

1. Въведение

В този урок ще проучим разликите между System.console () и System.out .

2. System.console ()

Нека първо създадем програма за извличане на обекта на конзолата :

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

Стартирането на тази програма от интерактивен терминал ще изведе нещо като [имейл защитен]

Изпълнението му от други носители обаче ще хвърли 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.