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

pobjuy32  于 2021-07-06  发布在  Java
关注(0)|答案(5)|浏览(282)

当用户在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之前不会意识到用户的输入。

yzxexxkh

yzxexxkh1#

我编写了一个java类rawconsoleinput,它使用jna调用windows和unix/linux的操作系统函数。
在它使用的windows上 _kbhit() 以及 _getwch() 从msvcrt.dll。
在unix上使用 tcsetattr() 要将控制台切换到非规范模式, System.in.available() 检查数据是否可用 System.in.read() 从控制台读取字节。一 CharsetDecoder 用于将字节转换为字符。
它支持非阻塞输入和混合原始模式和正常线路模式输入。

eanckbw9

eanckbw92#

没有可移植的方法从java控制台读取原始字符。
上面介绍了一些依赖于平台的解决方法。但要真正做到可移植,您必须放弃控制台模式,使用窗口模式,例如awt或swing。

uajslkp6

uajslkp63#

你需要把你的主机打到原始模式。没有内置的独立于平台的方式来实现这一点。不过,jCourses可能很有趣。
在unix系统上,这可能会起作用:

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

例如,如果您想考虑两次击键之间的时间,下面是示例代码。

ckx4rj1h

ckx4rj1h4#

您要做的是将控制台置于“raw”模式(绕过行编辑,不需要回车键)而不是“cooked”模式(使用回车键进行行编辑)。在unix系统上,“stty”命令可以更改模式。
现在,关于java。。。请参阅python和java中的非阻塞控制台输入。节选:
如果您的程序必须是基于控制台的,那么您必须将终端从行模式切换到字符模式,并记住在程序退出之前还原它。没有可移植的方法可以跨操作系统实现这一点。
其中一个建议是使用jni。再说一遍,那不是很方便携带。本文结尾的另一个建议(与上面的文章相同)是研究如何使用jCourses。

46qrfjad

46qrfjad5#

使用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();

相关问题