2016-03-22 2 views
1

Я пытаюсь создать цикл while, который будет работать до нажатия клавиши. Я использую этот код:Как правильно закончить цикл while с помощью нажатия клавиши?

while (System.in.available() == 0){ 
      // do something 
    } 

к сожалению, это не работает. есть ли какой-нибудь способ? что может быть причиной этого? Я должен упомянуть, что во время цикла я печатаю вещи на консоль, может ли это быть причиной?

любая помощь была бы признательна, благодарю вас за помощь.

+0

'Ctrl + C' работает для большинства терминалов. – Kody

+0

Я не пытаюсь завершить всю программу, просто чтобы закончить этот конкретный цикл. –

+0

Вы считали класс KeyListener? –

ответ

0

Из JavaDocs:

Имеющийся метод класса InputStream всегда возвращает 0.

Как System.in является InputStream, это могло бы объяснить вашу проблему.

+1

Это не то, что он хочет. – Hackerdarshi

+0

Извините, забыли упомянуть. Ожидание нажатия клавиш зависит от реализации jre. – jr593

+0

@ user3181718 Что вы имеете в виду? все, что я хочу, это то, что при любом нажатии клавиши этот конкретный цикл будет прерываться. после цикла, который я хочу выполнить после этого цикла, будет больше кода. –

0

Если вы хотите, чтобы цикл работал постоянно и остановился, как только вы нажмете любую клавишу, вам придется использовать для этого дополнительные библиотеки (по крайней мере, jline и jcurses существуют). Используя стандартные методы, вам нужно нажать enter, чтобы очистить буферы, и он не будет работать плавно, как вы, вероятно, захотите.

Кроме того, вам никогда не понадобится использовать available() (и он не будет делать то, что вы надеетесь).

+0

Вы можете привести пример работы с этими библиотеками? –

+0

Я уверен, что они хорошо документированы. – Kayaman

0

Хорошо, для консольных приложений вы пробовали System.in.read()? Вот ссылка на пример: http://www.java2s.com/Code/JavaAPI/java.lang/Systeminread.htm

Я оставлю свой ответ ниже для потомков и других людей, которые ищут похожий ответ на приложения с пользовательским интерфейсом. Вы хотите использовать KeyListener для захвата нажатого клавиши. Вот пример того, как его реализовать. http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

Затем вы можете зациклиться и посмотреть флаг, который вы устанавливаете при нажатии клавиши. Вы можете захотеть спать для коротких бит (250 или 500 мс) во время цикла, или вы будете создавать цикл, который будет очень быстро поглощать все вычислительные циклы.

+0

Это будет работать только в графической среде. – Kayaman

+0

Ах, я пропустил подсказку о консоли. – wandercoder

+0

Я добавил в начало, как обращаться с консольными приложениями. – wandercoder

-1
public class Test { 

    public static void main(String[] args) throws InterruptedException { 
     Thread a = new Thread() { 
      @Override 
      public void run() { 
       try { 
        while (true) { 
         System.out.println("A loop"); 
         sleep(2000); 
        } 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     try { 
      a.start(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      br.readLine(); 
      a.stop(); 
      a.join(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
  1. Создайте основной цикл внутри нити с делать свой бизнес (здесь, я распечатать: «Петля»
  2. Start что нить
  3. Ожидание ключа из консоли
  4. Прервать нить Как я вижу, вам не потребовалось ни одного удара с клавиатуры, чтобы завершить цикл, поэтому нажмите клавишу, а затем введите
-1

Другим методом является включение Swing на import javax.swing.*; и использование функции для отображения: variable = JOptionPane.showInputDialog(). Это активирует окно с кнопками «ОК» и «Отмена». Это правильно работало в моих программах.

+0

Это будет работать только в графической среде, а не в консоли. – Kayaman

+0

Да. Пользователь должен пройти шаг за шагом и наблюдать за выходом внутри окна. Но всякий раз, когда он может его прерывать. – user1382181

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