如何从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。