2017-02-07 21 views
0

Я читаю со стандартного ввода, используя следующий цикл:Как я могу проверить с помощью stdin, если нажата комбинация клавиш Ctrl + d?

Scanner stdin = new Scanner(System.in); 

while (stdin.hasNextLine() && stdin.nextLine() != null) { 

     String line = stdin.nextLine(); 

     if (!(line.contains("#"))) { 
      input.add(line); 
     } 

     if (line.contentEquals("q")) { 
      break; 
     } 

} 

Теперь это легко прекратить, если я просто введите q и нажмите Enter, однако я должен прекратить программу, когда пользователь нажимает Ctrl + d на новой линии. Я не могу заставить это работать, когда я нажимаю Ctrl + d, ничего не происходит.

ответ

0

Проблема заключается в том, что hasNextLine() и hasLine() ждут ввода пользователем «enter».

Ctrl-D не ... введите.

Таким образом, вы должны изучить, например, «символ по характеру».

Возможно, scanner.next() вернет вам что-то более полезное.

Кроме того, все сложнее, см., Например, here.

Таким образом, реальный, не очень полезный ответ на самом деле: Java-сканер и клавиши «ctrl-something» не совсем лучшие друзья.

Возможно, вы могли бы изучить некоторые библиотеки, предоставляя вместо этого функцию curses.

+0

Если я изменяю условие while на 'while (stdin.next()! = Null)' Я получаю исключение 'NoSuchElementException' на' Ctrl + d' – Alk

+0

Есть ли что-то еще, что вы предлагаете, я могу использовать для чтения из стандартного вход вместо сканера? – Alk

+0

Так что я должен в основном попытаться поймать это исключение и предположить, что когда это произойдет, весь вход был предоставлен? – Alk