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

问题描述 投票:98回答:5

当用户在Java中键入时,是否有一种从控制台读取单个字符的简单方法?可能吗?我尝试过这些方法但他们都在等待用户按下回车键:

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之前不知道用户输入。

java input console
5个回答
57
投票

您想要做的是将控制台置于“原始”模式(绕过行编辑并且不需要输入键),而不是“熟”模式(需要使用回车键进行行编辑。)在UNIX系统上,'stty'命令可以改变模式。

现在,关于Java ...请参阅Non blocking console input in Python and Java。摘抄:

如果您的程序必须基于控制台,则必须将终端脱机模式切换到字符模式,并记住在程序退出之前将其恢复。在操作系统中没有可移植的方法。

其中一个建议是使用JNI。再说一遍,这不是很便携。线程末尾的另一个建议,与上面的帖子一样,是看看使用jCurses


23
投票

您需要将控制台敲入原始模式。没有内置的平台无关的方式。但是,jCurses可能很有趣。

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

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

For example, if you want to take into account the time between keystrokes, here's sample code to get there.


14
投票

没有可移植的方法从Java控制台读取原始字符。

上面已经介绍了一些与平台相关的变通方法。但要真正便携,你必须放弃控制台模式并使用窗口模式,例如AWT或Swing。


13
投票

我编写了一个Java类RawConsoleInput,它使用JNA来调用Windows和Unix / Linux的操作系统函数。

  • 在Windows上,它使用来自msvcrt.dll的_kbhit()_getwch()
  • 在Unix上,它使用tcsetattr()将控制台切换到非规范模式,System.in.available()检查数据是否可用,System.in.read()从控制台读取字节。 CharsetDecoder用于将字节转换为字符。

它支持无阻塞输入和混合原始模式和普通线路模式输入。


6
投票

使用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();
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.