Как прочитать один символ из консоли на 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 нажата.

Ответы на вопрос(5)

использованиеjline3:

Пример:

Terminal terminal = TerminalBuilder.builder()
    .jna(true)
    .system(true)
    .build();

// raw mode means we get keypresses rather than line buffered input
terminal.enterRawMode();
reader = terminal .reader();
...
int read = reader.read();
....
reader.close();
terminal.close();
Решение Вопроса

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

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

If your program must be console based, you have to switch your terminal out of line mode into character mode, and remember to restore it before your program quits. There is no portable way to do this across operating systems.

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

Я написал класс JavaRawConsoleInput который используетЮНА вызывать функции операционной системы Windows и Unix / Linux.

  • On Windows it uses _kbhit() and _getwch() from msvcrt.dll.
  • On Unix it uses tcsetattr() to switch the console to non-canonical mode, System.in.available() to check whether data is available and System.in.read() to read bytes from the console. A CharsetDecoder is used to convert bytes to characters.

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

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

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

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

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

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

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

Ваш ответ на вопрос