Answers:
您想要做的就是将控制台置于“原始”模式(绕过行编辑并且不需要输入键),而不是“经烹煮”模式(需要输入键进行行编辑)。在UNIX系统上,'stty'命令可以更改模式。
现在,关于Java ...参见Python和Java中的非阻塞控制台输入。摘抄:
如果您的程序必须基于控制台,则必须将终端从行模式切换到字符模式,并记住在程序退出之前将其还原。没有跨操作系统的可移植方法。
建议之一是使用JNI。同样,这不是很容易移植。线程结尾处的另一个建议与上述文章一样,是使用jCurses。
您需要将控制台打成原始模式。没有内置的独立于平台的方法。jCurses可能很有趣。
在Unix系统上,这可能起作用:
String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();
stty cooked </dev/tty
应该在程序需要恢复到缓冲模式时运行,并且一定要在程序退出之前运行。
我写了一个Java类RawConsoleInput,它使用JNA调用Windows和Unix / Linux的操作系统功能。
_kbhit()
和_getwch()
从MSVCRT.DLL。tcsetattr()
将控制台切换到非规范模式,System.in.available()
以检查数据是否可用以及System.in.read()
从控制台读取字节。A CharsetDecoder
用于将字节转换为字符。它支持无阻塞输入以及混合原始模式和法线模式输入。
使用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();