如何在Java中从控制台读取单个字符(当用户键入它时)?

2022-08-31 08:22:44

有没有一种简单的方法可以在用户用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键之前不知道用户输入。


答案 1

您要做的是将控制台置于“原始”模式(绕过行编辑,无需 Enter 键),而不是“熟”模式(需要使用 Enter 键进行行编辑)。在 UNIX 系统上,“stty”命令可以更改模式。

现在,关于Java...请参阅 Python 和 Java 中的非阻塞控制台输入。摘录:

如果您的程序必须基于控制台,则必须将终端从行模式切换到字符模式,并记住在程序退出之前将其还原。没有跨操作系统执行此操作的便携式方法。

其中一个建议是使用 JNI。同样,这不是很便携。线程末尾的另一个建议,与上面的帖子相同,是考虑使用jCurses


答案 2

您需要将主机推入原始模式。没有内置的独立于平台的方式到达那里。不过,jCurses可能很有趣。

在Unix系统上,这可能有效:

String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();

例如,如果要考虑击键之间的时间,下面是获取该位置的示例代码。


推荐