我正在编写一个java程序(在Intellij中),它接受用户的命令并对命令作出反应。这个反应是异步的(使用一个单独的线程)。
Scanner in = new Scanner(System.in);
String command = null;
do {
System.out.println("Enter command or q to exit: ");
command = in.nextLine();
System.out.println("Received "+command);
obj.react(command);
}while (!command.equals("q"));
问题是,如果我开始输入一个命令,在我完成之前,对象打印出一些东西,输入的命令就会丢失。
例如 下面是一个有问题的场景(斜体字的文字是用户输入的)。
输入命令或q退出。
输入命令或q退出:
收到去
重新出发obj完成了反应!
收到
在这种情况下,当我在打印信息后按回车键时,收到的命令是空的。
有什么方法可以让输入的字符在打印后还能保留?
如果你使用一个实际的控制台,打印的输出不会影响写的输入。如果你输入'go',系统打印出'再次',那么in-buffer仍然知道'go'。这是不直观的,不好读,但它是实用的中断运行的脚本,或其他程序。
这可能已经在你的IDE或系统上工作了,取决于操作系统和IDE。
如果你想要一些更 "漂亮 "的东西,那么你需要完全控制输入和输出,就像linux中的 "top "命令(如果你碰巧知道的话)。Console
类。见。https:/www.codejava.netjava-sefile-io3-ways-for-reading-input-from-the-user-in-the-console #3
解决你的问题最直观的想法似乎是 读取,然后删除所有输入 在你想打印一些东西的时候,再打印出来,所以你会得到。
> go
received go
obj finished reacting!
> go
...
基本上你总是自己打印一行输入, 在先读取和删除已经打印的输入之后。这就是为什么你需要Console类,因为在那里,输入和输出是 同步因此,如果你打印一些东西,你知道在此期间不会发生任何输入。