Вопрос-ответ

How to read a single char from the console in Java (as the user types it)?

Как прочитать один символ из консоли в Java (когда пользователь вводит его)?

Есть ли простой способ прочитать отдельный символ из консоли, когда пользователь вводит его на Java? Возможно ли это? Я пробовал использовать эти методы, но все они ждут, пока пользователь нажмет клавишу enter:

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.

Переведено автоматически
Ответ 1

Что вы хотите сделать, так это перевести консоль в "необработанный" режим (редактирование строк обходится стороной и клавиша enter не требуется) в отличие от "готового" режима (редактирование строк с помощью клавиши enter требуется.) В системах UNIX команда 'stty' может изменять режимы.

Теперь, что касается Java ... смотрите неблокирующий консольный ввод в Python и Java. Отрывок:


Если ваша программа должна быть консольной, вам нужно перевести свой терминал из режима строки в режим символов и не забудьте восстановить его перед завершением работы вашей программы. Нет переносимого способа сделать это в разных операционных системах.


Одно из предложений - использовать JNI. Опять же, это не очень переносимо. Еще одно предложение в конце темы, перекликающееся с сообщением выше, - рассмотреть использование jCurses.

Ответ 2

Вам нужно перевести консоль в режим raw. Встроенного платформенно-независимого способа получить доступ к нему нет. Хотя может быть интереснымjCurses.

В системе Unix это может сработать:

String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();

Например, если вы хотите учесть время между нажатиями клавиш, вот пример кода, чтобы добиться этого.

Ответ 3

Я написал класс Java RawConsoleInput, который использует JNA для вызова функций операционной системы Windows и Unix / Linux.


  • В Windows он использует _kbhit() и _getwch() from msvcrt.dll.

  • В Unix он используется tcsetattr() для переключения консоли в неканонический режим, System.in.available() для проверки доступности данных и System.in.read() для чтения байтов из консоли. A CharsetDecoder используется для преобразования байтов в символы.

Он поддерживает неблокирующий ввод и смешивание raw-режима и обычного линейного ввода.

Ответ 4

Не существует переносимого способа чтения необработанных символов из консоли Java.

Выше были представлены некоторые зависящие от платформы обходные пути. Но чтобы быть действительно переносимым, вам пришлось бы отказаться от консольного режима и использовать оконный режим, например AWT или Swing .

2023-07-11 14:30 java