从键盘阅读并忽略打印文本

问题描述 投票:0回答:1

我正在编写一个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完成了反应!

收到

在这种情况下,当我在打印信息后按回车键时,收到的命令是空的。

有什么方法可以让输入的字符在打印后还能保留?

java asynchronous input java.util.scanner
1个回答
1
投票

如果你使用一个实际的控制台,打印的输出不会影响写的输入。如果你输入'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类,因为在那里,输入和输出是 同步因此,如果你打印一些东西,你知道在此期间不会发生任何输入。

© www.soinside.com 2019 - 2024. All rights reserved.