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

时间:2009-06-30 22:02:41

标签: java input console

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

6 个答案:

答案 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();

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

答案 2 :(得分:14)

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

上面介绍了一些依赖于平台的解决方法。但要真正便携,你必须放弃控制台模式并使用窗口模式,例如AWT或Swing。

答案 3 :(得分:12)

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

  • 在Windows上,它使用来自msvcrt.dll的_kbhit()_getwch()
  • 在Unix上,它使用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.");
        }
}