2013-03-26 9 views
0

Как очистить стандартный ввод (термин) в Java?Как очистить стандартный ввод (термин)

Немного истории: Я пишу «рефлекс» программа, алгоритм очень прост:

wait a random amount of time 
print "press enter" 
read line 

Дело в том, если пользователь нажал по ошибке ввести ключ, он будет читайте, чтобы тест был неправильным. Моя цель - исправить эту ошибку. Для этого, я хочу, чтобы алгоритм, как это:

wait a random amount of time 
clear stdin 
print "press enter" 
read line 

Но я не могу найти способ сделать это. This post кажется интересным: available получает количество оставшихся символов и skip пропустит их. Работает только на бумаге. Если Вы подчеркиваете приложение, нажав несколько раз клавишу ввода, метод available возвращает

оценку числа байтов, которые можно прочитать (или пропущено) от этого входного потока без блокирования

так что когда-то возвращаемое значение неверно, по крайней мере один возврат каретки остается в буфере, и ошибка все еще здесь.

This solution может сделать трюк, но это зависит от платформы, которого я не хочу быть. Кроме того, вызов системной процедуры с Java - довольно плохая идея.

Чтобы возобновить работу, я хочу очистить стандартный ввод моей программы, но я не хочу ее закрывать и не блокировать свою программу, ожидая ввода пользователем. Мне кажется очень сложной проблемой, так что мне стыдно, если ответ очевиден!

+0

Если вы не хотите принимать коды VT100, у вас нет большого количества вариантов. Но зачем это делать в консоли? Напишите действительно крошечное приложение Swing - проблема решена. –

ответ

1

У меня нет ответа на «clear stdin». Я думаю, что это ОС, и это даже не стоит пытаться.

Однако, чтобы решить вашу проблему, вы можете использовать java.util.Timer, который запрашивает пользователя в какое-то случайное время. Это будет работать в отдельном потоке. Когда ваш пользователь, наконец, нажал кнопку ввода, проверьте, был ли он/она запрошен.

Приведенный ниже пример кода напечатает «Press enter» через 5 секунд. Основной поток немедленно блокирует ожидание ввода пользователя, если ввод слишком рано, он скажет так, потому что булевский переключатель еще не включен.

* Примечание: TimerTest - это имя класса, с которым я играю. Не стесняйтесь менять его на все, что бы вы ни называли.

static boolean userPrompted = false; 

public static void main(String[] args) throws IOException { 

    // Setup a 5 second timer that prompts the user and switch the userPrompted flag to true 
    // This will run in a separate thread 
    Timer timer = new Timer(false); 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      System.out.println("Press enter"); 
      synchronized(TimerTest.class) { 
       userPrompted = true; 
      } 
     } 
    }, 5000); 

    // Blocks waiting for user input 
    System.out.println("Get ready.. press enter as soon as you're prompted.."); 
    String input = new BufferedReader(new InputStreamReader(System.in)).readLine(); 

    // Check if user has been prompted 
    synchronized (TimerTest.class) { 
     if(!userPrompted) System.out.println("You pressed enter before prompted"); 
     else System.out.println("You pressed enter after prompted"); 
    } 

} 
+0

Спасибо за ваш ответ. Да, это должно сделать работу, и я думаю, что я это сделаю. Тем не менее, как вы сказали, это не «ясный терминал», поэтому я буду ждать других вариантов, прежде чем проверять ваш ответ здесь. Еще раз спасибо. – FaustXVI

Смежные вопросы