Чтение с клавиатуры и игнорирование печатного текста - PullRequest
0 голосов
/ 04 мая 2020

Я пишу 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"));

Реагирующему объекту может потребоваться некоторое время, чтобы отреагировать и распечатать сообщение после его завершения. Проблема состоит в том, что если я начну вводить команду и до того, как я закончу sh, объект что-то напечатает, набранная команда будет потеряна.

Например Вот проблемный сценарий c (текст в курсивом является ввод данных пользователем):

Введите команду или q для выхода:

go

Получено go

goAgain obj закончил реагировать!

Получено

В этом случае, когда я нажимаю клавишу ввода после напечатанного сообщения, полученная команда пуста.

Есть ли способ сохранить напечатанные символы даже после того, как что-то напечатано?

1 Ответ

1 голос
/ 04 мая 2020

Если вы используете реальную консоль, печатный вывод не повлияет на письменный ввод. Если вы наберете «go», а система напечатает «Снова», то в буфере все равно будет «go». Это не интуитивно понятно и плохо читается, но практично прерывать выполнение скриптов или других программ.

Это может уже работать в вашей IDE или вашей системе, в зависимости от ОС и IDE.

Если вам нужно что-то более «красивое», тогда вам нужно полностью контролировать ввод и вывод, очень похоже на команду «top» в linux (если вам это известно). Вы можете справиться с этим способом ввода лучше с классом Console. См .: https://www.codejava.net/java-se/file-io/3-ways-for-reading-input-from-the-user-in-the-console # 3

Наиболее интуитивная идея для решения вашей проблемы - прочитать, а затем удалить все входные данные в тот момент, когда вы хотите что-то напечатать и перепечатайте его, так что вы получите:

> go
received go
obj finished reacting!
> go
...

Вы в основном всегда печатаете строку ввода самостоятельно, предварительно прочитав и удалив уже напечатанный ввод. Вот почему вам нужен класс Console, потому что там, вход и выход синхронизированы , поэтому, если вы печатаете что-то, вы знаете, что за это время ввода не произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...