Читать ввод, пока контроль + d - PullRequest
0 голосов
/ 30 апреля 2011

Я хочу предложить пользователю начать ввод символов, и я хочу, чтобы они могли вводить символы столько, сколько они хотят, пока они не нажмут Ctrl + D для выхода.

Например, они могут ввестистрока чисел, например: 1234567, и как только они решат нажать Ctrl + D, отобразится введенная ими строка (поэтому без необходимости возвращать)

Я думаю, мне понадобится буферизованный читатель иличто-то.Есть предложения?

Ответы [ 5 ]

4 голосов
/ 02 мая 2012

То, что сказал 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.

3 голосов
/ 30 апреля 2011

http://download.oracle.com/javase/6/docs/api/java/io/BufferedInputStream.html#read%28%29

public class InputTest {
  public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder out = new StringBuilder();
    while (true) {
      try {
        int c = in.read();
        if (c != 4)  // ASCII 4 04 EOT (end of transmission) ctrl D, I may be wrong here
            out.append (c);
        else
            break;
      } catch (IOException e) {
        System.err.println ("Error reading input");
      }
    }
    System.out.println(out.toString());
  }
}
2 голосов
/ 30 апреля 2011

Вы путаете роли вашей Java-программы и терминала.Терминал буферизует ввод и иногда передает его в программу Java, особенно после перевода строки.Ctrl + D также заставляет терминал делать буферизованный ввод доступным или, если ничего не буферизовано, завершать ввод.Запрос программы на выполнение чего-либо с помощью Ctrl + D - это, по сути, просьба сделать что-то, когда она читает все доступные данные (и другие могут стать доступными позже).Буферизация ввода на стороне Java сделает вещи более сложными, а не менее.

0 голосов
/ 19 ноября 2016

попробуйте этот код.это на самом деле работает для меня

    // press ctrl+Z(windows) and ctrl+D(mac, linux) for input termination
    StringBuilder out = new StringBuilder();
    String text = null;
    Scanner scanner = new Scanner( System.in );
    while( scanner.hasNextLine() )
    {
        text = new String( scanner.nextLine() );
        out.append( text );
    }
    scanner.close();
    System.out.println( out );
    System.out.println( "program terminated" );
0 голосов
/ 30 апреля 2011

В графическом интерфейсе вы можете использовать KeyListener.

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