当用户在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之前不知道用户输入.
您想要做的是将控制台置于"原始"模式(绕过行编辑并且不需要输入键),而不是"熟"模式(需要使用回车键进行行编辑.)在UNIX系统上,'stty'命令可以改变模式.
现在,关于Java ...请参阅Python和Java中的非阻塞控制台输入.摘抄:
如果您的程序必须基于控制台,则必须将终端脱机模式切换到字符模式,并记住在程序退出之前将其恢复.在操作系统中没有可移植的方法.
其中一个建议是使用JNI.再说一遍,这不是很便携.线程末尾的另一个建议,与上面的帖子一样,是使用jCurses.
您需要将控制台敲入原始模式.没有内置的平台无关的方式.但是jcurses可能很有趣.
在unix系统上,这可能有效:
String[] cmd = {"/bin/sh", "-c", "stty raw例如,如果你想考虑击键之间的时间,这里是示例代码.
"例如......"链接现在已经死了.
3> rustyx..:没有可移植的方法从Java控制台读取原始字符.
上面已经介绍了一些与平台相关的变通方法.但要真正移植,你必须放弃控制台模式并使用窗口模式,例如AWT或Swing.
我不太明白为什么例如Mono(或CLR)具有适用于所有平台的`System.Console.ReadKey`.Java还为具有平台依赖库和实现的每个平台分发JVM和JRE,因此这不是借口.
4> Christian d'..:我编写了一个Java类RawConsoleInput,它使用JNA来调用Windows和Unix/Linux的操作系统函数.
在Windows上,它使用
_kbhit()
和_getwch()
来自msvcrt.dll.在Unix上,它用于
tcsetattr()
将控制台切换到非规范模式,System.in.available()
以检查数据是否可用以及System.in.read()
从控制台读取字节.ACharsetDecoder
用于将字节转换为字符.
它支持无阻塞输入和混合原始模式和普通线路模式输入.
@QPaysTaxes压力测试对于控制台输入很困难.我认为,在这种情况下,在各种环境(不同的Windows/Linux版本,64/32位,Linux通过SSH,Telnet,串行端口或桌面控制台等)中进行测试更为重要.到目前为止,我只在我的私人测试工具中使用它.但与其他解决方案(如使用Jansi的JLine2)相比,源代码相对较小.所以没有太多可能出错的地方.我写了它,因为JLine2不支持单字符输入而没有阻塞.
5> Pod..:使用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();