char Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 локализация».
Предыдущая статья — «Java 8 форматирование и парсинг».
Стандартный поток ввода java.lang.System.in, стандартный поток выводы java.lang.System.out, стандартный поток ошибок java.lang.System.err — все эти потоки по умолчанию обычно работают с консолью, но в некоторых случаях могут быть связаны с файлом или ещё чем-нибудь. Потоки java.lang.System.out и java.lang.System.err являются экземплярами класса java.io.PrintStream. Входной поток java.lang.System.in является экземпляром java.io.InputStream. Мы уже рассматривали все эти классы и видели примеры их использования.
java.io.Console
Содержит методы для доступа к консоли, если есть консоль, связанная с текущей виртуальной машиной.
Имеет ли виртуальная машина консоль или нет, зависит от платформы и способа запуска виртуальной машины. Если виртуальная машина запущена со стандартной интерактивной консоли без перенаправления стандартных потоков ввода и вывода, то консоль есть, и обычно она связана с клавиатурой и экраном, из которого запущена виртуальная машина. Если виртуальная машина была запущена автоматически, например как фоновый процесс, то обычно она не имеет консоли.
Если виртуальная машина имеет консоль, то может быть получен уникальный экземпляр этого класса с помощью вызова java.lang.System.console(). Если нет доступной консоли, то метод вернёт null.
Операции ввода и вывода синхронизированы, чтобы гарантировать атомарное выполнение критических операций, поэтому вызов методов readLine(), readPassword(), format(), printf(), а также операции чтения, форматирования и записи из объектов, возвращённых из reader() и writer() могут привести к блокировке при многопоточности.
Вызов close() для объектов, возвращённых из reader() и writer() не закрывает поток этих объектов.
Методы чтения из консоли возвращают null, если был достигнут конец потока ввода, например ввод Ctrl+D в Unix или Ctrl+Z в Windows. Последующие операции чтения будут успешны, если в консоль позже были введены дополнительные символы.
Если приложению нужно считать пароль или любую другую секретную информацию, то оно должно использовать readPassword() или readPassword(String, Object..), а затем после обработки вручную забить пробелами считанный пароль, чтобы минимизировать время пребывания секретных данных в памяти.
1 2 3 4 5 6 7 |
Console cons; char[] passwd; if ((cons = System.console()) != null && (passwd = cons.readPassword("[%s]", "Password:")) != null) { ... java.util.Arrays.fill(passwd, ' '); } |
Подробнее про очистку паролей из памяти после использования можно прочесть в моей специальной статье.
Полезные методы класса
java.io.Console:
1 |
public void flush() |
Принудительно очищает буферы, выводя содержащуюся в них информацию на экран.
1 2 |
public Console format(String fmt, Object... args) |
Форматированный вывод в консоль. Смотрите описание java.util.Formatter в статье «Java 8 форматирование и парсинг».
1 2 |
public Console printf(String format, Object... args) |
Форматированный вывод в консоль. Смотрите описание java.util.Formatter в статье «Java 8 форматирование и парсинг».
1 |
public Reader reader() |
Возвращает
java.io.Reader, связанный с консолью. Смотрите описание в статье «Java 8 потоки ввода/вывода».
1 |
public String readLine() |
Читает одну строку текста из консоли.
1 2 |
public String readLine(String fmt, Object... args) |
Выводит форматированную строку в консоль, а затем считывает одну строку введённого пользователем текста.
1 |
public char[] readPassword() |
Используется для считывания паролей из консоли. Не отображает вводимые пользователем символы. Обратите внимание, что возвращается массив
char-ов, это сделано специально из соображений безопасности. Подробнее читайте в статье про работу с паролями в Java.
1 2 |
public char[] readPassword(String fmt, Object... args) |
Выводит форматированную строку, а затем считывает пароль с экрана. Не отображает вводимые пользователем символы.
1 |
public PrintWriter writer() |
Возвращает java.io.PrintWriter , связанный с этой консолью. Смотрите описание java.io.PrintWriter в статье «Java 8 потоки ввода/вывода».
Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 локализация».
Предыдущая статья — «Java 8 форматирование и парсинг».