То, что сказал rlibby, точно: CTL-D заставит терминал сбрасывать буферизованный ввод в JVM.Однако само событие нажатия клавиши фиксируется и обрабатывается терминалом и не передается.
К счастью, это легко обнаружить.Если пользователь нажимает CTL-D в отдельной строке, то нет ввода для сброса ... который в JVM неотличим от EOF.Соответственно, System.in.read()
вернет -1
за контракт InputStream
.Если вы обернули System.in
BufferedReader
, readLine()
вернет null
.
Это мой основной цикл для интерактивного инструмента командной строки. Я только что написал:
BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
String line;
while((line = systemIn.readLine()) != null) {
// my program loop.
}
Стоит отметить, что если пользователь нажимает CTL-D после ввода символов (но до нажатия возврата), вы получите эти символы.Я не верю, что есть способ обнаружить CTL-D, когда он не находится на собственной линии.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я понятия не имею, как это применимо к Windows.