当用户在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 之前不知道用户输入。
答案 0 :(得分:57)
你想要做的是将控制台置于“原始”模式(行编辑被绕过而不需要输入键),而不是“熟”模式(需要使用回车键进行行编辑。)在UNIX系统上,'stty '命令可以改变模式。
现在,关于Java ...请参阅Non blocking console input in Python and Java。摘录:
如果您的程序必须基于控制台, 你必须切换你的终端 线模式进入字符模式,和 记得在你之前恢复它 程序退出。没有便携式 在整个运营过程中做到这一点 系统
其中一个建议是使用JNI。再说一遍,这不是很便携。线程末尾的另一个建议,与上面的帖子一样,是使用jCurses来查看。
答案 1 :(得分:23)
您需要将控制台敲入原始模式。没有内置的平台无关的方式。 jCurses可能会很有趣。
在Unix系统上,这可能有效:
String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();
答案 2 :(得分:14)
没有可移植的方法从Java控制台读取原始字符。
上面介绍了一些依赖于平台的解决方法。但要真正便携,你必须放弃控制台模式并使用窗口模式,例如AWT或Swing。
答案 3 :(得分:12)
我编写了一个Java类RawConsoleInput,它使用JNA来调用Windows和Unix / Linux的操作系统函数。
_kbhit()
和_getwch()
。tcsetattr()
将控制台切换到非规范模式,System.in.available()
检查数据是否可用,System.in.read()
从控制台读取字节。 CharsetDecoder
用于将字节转换为字符。它支持非阻塞输入和混合原始模式和普通线路模式输入。
答案 4 :(得分: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();
答案 5 :(得分:1)
我已经使用 jcurses 完成了...
import jcurses.system.InputChar;
import jcurses.system.Toolkit;
//(works best on the local machine when run through screen)
public class readchar3 {
public static void main (String[] args)
{
String st;
char ch;
int i;
st = "";
ch = ' ';
i = 0;
while (true)
{
InputChar c = Toolkit.readCharacter();
ch = c.getCharacter();
i = (int) ch;
System.out.print ("you typed " + ch + "(" + i + ")\n\r");
// break on '#'
if (ch == '#') break;
}
System.out.println ("Programm wird beendet. Verarbeitung kann beginnen.");
}
}