如何从Java中的控制台读取单个字符(用户input它)?
当用户使用Javainput时,是否有简单的方法从控制台读取单个字符? 可能吗? 我已经尝试过这些方法,但他们都等待用户按下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不知道用户input,直到input被按下。
你需要做的是把控制台变成“原始”模式(线路编辑绕过,不需要input密钥),而不是“熟”模式(需要使用回车键进行行编辑)。在UNIX系统上,“stty”命令可以改变模式。
现在,关于Java …请参阅Python和Java中的非阻塞控制台input 。 摘抄:
如果您的程序必须是基于控制台的,则必须将terminal切换成字符模式,并记住在程序退出之前将其恢复。 在操作系统上没有可移植的方式来做到这一点。
其中一个build议是使用JNI。 再次,这不是很便携。 在线程末尾的另一个build议,和上面的post一样,是使用jCurses 。
你需要敲你的控制台进入原始模式。 没有内置的平台无关的方式到达那里。 jCurses可能是有趣的,但。
在unix系统上,这可能工作:
String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"}; Runtime.getRuntime().exec(cmd).waitFor();
例如,如果你想考虑击键之间的时间,下面是示例代码。
没有可移植的方式从Java控制台读取原始字符。
上面已经介绍了一些平台相关的解决方法。 但是为了实现便携性,您必须放弃控制台模式并使用窗口模式,例如AWT或Swing。
我写了一个Java类RawConsoleInput ,它使用JNA调用Windows和Unix / Linux的操作系统函数。
- 在Windows上,它使用
_kbhit()
和_getwch()
。 - 在Unix上,它使用
tcsetattr()
将控制台切换到非规范模式,System.in.available()
检查数据是否可用,System.in.read()
从控制台读取字节。CharsetDecoder
用于将字节转换为字符。
它支持非阻塞input和混合原始模式和正常线路模式input。