Попытка чтения с консоли в Java

Я только начал изучать Java с IntelliJ IDE. Я немного знаю C #, поэтому логика имеет какой-то смысл, однако до сих пор я не мог ее преодолеть.

Как читать с консоли? В C # вы можете легко прочитать, что человек набрал в нее, используя Console.ReadLine() . В Java, System.console().readLine(); не работает для меня и NullPointerException .

Что мне здесь не хватает?

проблема

Большинство 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 “Это работало для меня.

  • Получение параметров хеширования из запроса URL
  • Java Runtime.exec ()
  • Облачные сообщения Google в Delphi XE5?
  • Заполните поля в веб-просмотре автоматически
  • Метод getText () должен быть вызван из streamа пользовательского интерфейса (Android Studio)
  • Как получить частоту от результата fft?
  • Есть ли способ разбивки запросов путем комбинирования курсоров запросов с использованием FirestoreRecyclerAdapter?
  • Поместить внешнюю библиотеку в JAR?
  • Android Studio не удалось найти версию, совместимую с com.android.support:appcompat-v7:+
  • Нет доступного экземпляра типа
  • Как увидеть JavaDoc в IntelliJ IDEA?
  • Interesting Posts

    Как передать ссылку на двумерный массив функции?

    jQuery Ajax дождитесь загрузки всех изображений

    Как распечатать UTF-8 из консольного приложения c ++ в Windows

    В bash, как я могу переименовать файл, не повторяя путь?

    Как интегрировать весну с сеансом гибернации и управлением транзакциями?

    Самый простой способ открыть CSV с запятыми в Excel

    Ошибки данных URI и ошибки Internet Explorer 9

    Можно ли установить 32-битные программы в «Program Files» в 64-битных окнах вместо «Program Files (x86)?

    Bash: ограничить количество одновременных заданий?

    Могу ли я открыть новые вкладки в Opera с загруженной, а не пустой?

    Как я могу конвертировать путь к файлу UNC в файл URI без использования каких-либо сторонних инструментов или вручную?

    Изменение размера таблицы / столбца / индекса в oracle 11g или 12c

    java.util.Timer: устарел ли он?

    Android TabLayout Android Design

    Распечатывать элементы из массива с запятой между элементами, кроме последнего слова

    Давайте будем гением компьютера.