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.