Есть ли простой способ прочитать один символ из консоли, когда пользователь вводит его на Java? Является ли это возможным? Я пробовал использовать эти методы, но все они ждут, пока пользователь нажмет клавишу ввода :
char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read(); // Java 6
Я начинаю думать, что System.in не знает ввода пользователя, пока не будет нажата клавиша Enter .
Вам нужно вывести консоль в необработанный режим. Нет встроенного независимого от платформы способа добраться туда. Хотя jCurses может быть интересным.
В системе Unix это может сработать:
Например, если вы хотите учитывать время между нажатиями клавиш, вот пример кода для этого.
источник
stty cooked </dev/tty
следует запускать, когда программе необходимо вернуться в буферный режим, и обязательно до выхода из программы.Не существует переносимого способа чтения необработанных символов с консоли Java.
Некоторые обходные пути, зависящие от платформы, были представлены выше. Но чтобы быть действительно портативным, вам нужно отказаться от консольного режима и использовать оконный режим, например AWT или Swing.
источник
System.Console.ReadKey
работает на всех платформах. Java также распространяет JVM и JRE для каждой платформы с зависимыми от платформы библиотеками и реализациями, так что это не оправдание.Я написал Java-класс RawConsoleInput, который использует JNA для вызова функций операционной системы Windows и Unix / Linux.
_kbhit()
и_getwch()
из msvcrt.dll.tcsetattr()
для переключения консоли в неканонический режим,System.in.available()
для проверки наличия данных иSystem.in.read()
для чтения байтов с консоли. ACharsetDecoder
используется для преобразования байтов в символы.Он поддерживает неблокирующий ввод и режим микширования необработанного и нормального линейного режима ввода.
источник
Используйте jline3 :
Пример:
источник