当用户在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条答案
按热度按时间yzxexxkh1#
我编写了一个java类rawconsoleinput,它使用jna调用windows和unix/linux的操作系统函数。
在它使用的windows上
_kbhit()
以及_getwch()
从msvcrt.dll。在unix上使用
tcsetattr()
要将控制台切换到非规范模式,System.in.available()
检查数据是否可用System.in.read()
从控制台读取字节。一CharsetDecoder
用于将字节转换为字符。它支持非阻塞输入和混合原始模式和正常线路模式输入。
eanckbw92#
没有可移植的方法从java控制台读取原始字符。
上面介绍了一些依赖于平台的解决方法。但要真正做到可移植,您必须放弃控制台模式,使用窗口模式,例如awt或swing。
uajslkp63#
你需要把你的主机打到原始模式。没有内置的独立于平台的方式来实现这一点。不过,jCourses可能很有趣。
在unix系统上,这可能会起作用:
例如,如果您想考虑两次击键之间的时间,下面是示例代码。
ckx4rj1h4#
您要做的是将控制台置于“raw”模式(绕过行编辑,不需要回车键)而不是“cooked”模式(使用回车键进行行编辑)。在unix系统上,“stty”命令可以更改模式。
现在,关于java。。。请参阅python和java中的非阻塞控制台输入。节选:
如果您的程序必须是基于控制台的,那么您必须将终端从行模式切换到字符模式,并记住在程序退出之前还原它。没有可移植的方法可以跨操作系统实现这一点。
其中一个建议是使用jni。再说一遍,那不是很方便携带。本文结尾的另一个建议(与上面的文章相同)是研究如何使用jCourses。
46qrfjad5#
使用jline3:
例子: