Попытка чтения с консоли в Java
Я только начал изучать Java с IntelliJ IDE. Я немного знаю C #, поэтому логика имеет какой-то смысл, однако до сих пор я не мог ее преодолеть.
Как читать с консоли? В C # вы можете легко прочитать, что человек набрал в нее, используя Console.ReadLine()
. В Java, System.console().readLine();
не работает для меня и NullPointerException
.
Что мне здесь не хватает?
- Проверка сертификатов X509 с использованием Java APis
- Измените .txt-файл в Java
- Есть ли у java int.tryparse, который не генерирует исключение для плохих данных?
- какова разница между локальными и переменными экземпляра в Java
- Чтение массива Json в андроиде
- Почему возникает ArrayIndexOutOfBoundsException и как его избежать в Android?
- как проверить Wi-Fi или 3g-сеть доступна на Android-устройстве
- Как отправить данные из диалогового windows в fragment?
- Как поместить банку в classpath в Eclipse?
- android MapView в fragmentе
- Как выйти из приложения Java из программы
- Как использовать UTF-8 в свойствах ресурсов с помощью ResourceBundle
- Уровень заряда батареи и состояние в Android
проблема
Большинство IDE используют javaw.exe
вместо java.exe
для запуска кода Java (см. Изображение ниже).
Разница между этими двумя программами заключается в том, что javaw
запускает Java-код без связи с текущим терминалом / консолью (что полезно для приложений GUI), и поскольку нет соответствующего windows консоли, System.console()
возвращает null
. Из-за этого System.console().readLine()
заканчивается как null.readLine()
который выдает null.readLine()
NullPointerException
поскольку null
не имеет метода readLine()
(или любого метода / поля).
Но только потому, что нет связанной консоли, это не значит, что мы не можем общаться с javaw
процессом. Этот процесс по-прежнему поддерживает стандартные streamи ввода / вывода / ошибок, поэтому процесс IDE (и через него также мы) может использовать их через System.in
, System.out
и System.err
.
Таким образом, IDE могут иметь некоторую вкладку / окно и позволить имитировать консоль.
Например, когда мы запускаем код, как в Eclipse:
package com.stackoverflow; public class Demo { public static void main(String[] args) throws Exception { System.out.println("hello world"); System.out.println(System.console()); } }
мы увидим в результате
что, несмотря на то, что javaw.exe
не имеет связанной консоли ( null
в конце), IDE смог обрабатывать данные из стандартного вывода javaw
процесса System.out.println("hello world");
и показать hello world
.
Общее решение
Чтобы позволить пользователю передавать информацию для обработки, используйте стандартный stream ввода ( System.in
). Но поскольку in
простой InputStream
и Stream
s предназначены для обработки двоичных данных, у него нет методов, которые позволяли бы легко и правильно читать данные в виде текста (особенно если кодирование может быть задействовано). Именно поэтому к Java добавлены Readers
и Writers
.
Чтобы облегчить жизнь и позволить программе читать данные от пользователя в виде текста, вы можете обернуть этот stream в один из таких BufferedReader
Reader
как BufferedReader
который позволит вам прочитать целую строку с помощью метода readLine()
. К сожалению, этот class не принимает Streams
но Reader
s, поэтому нам нужен какой-то адаптер, который будет имитировать Reader и сможет переводить байты в текст. Но именно поэтому InputStreamReader
существует.
Таким образом, код, который позволит приложениям считывать данные из входного streamа, может выглядеть так:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Hello. Please write your name: "); String name = br.readLine(); System.out.println("Your name is: "+name);
Предпочтительное / простое решение – Сканер
Чтобы избежать этой магии, связанной с преобразованием Stream в Reader, вы можете использовать class Scanner
, который предназначен для чтения данных в виде текста из Streams and Readers.
Это означает, что вы можете просто использовать
Scanner scanner = new Scanner(System.in); //... String name = scanner.nextLine();
для чтения данных от пользователя (которые будут отправляться с помощью консоли, моделируемой IDE, с использованием стандартного streamа ввода).
java.util.Scanner
API – это то, что вы ищете.
Если вам действительно нужен объект консоли, вы можете скомпилировать свой class из командной строки. Во-первых, в моем java-файле первый оператор – package com.inputOutput;
Зайдите в папку проекта src
и скомпилируйте ее так: « javac com/inputOutput/Password.java
» « com
» и « inputOutput
– это папка (пакет). Запустите файл classа в папке src
java com.inputOutput.Password
“Это работало для меня.