Как сказать BufferedReader прекратить чтение из System.in?

Я использую bufferedReader для чтения System.in от пользователя. Пользователь вводит адрес домена и исходный адрес, разделенные пробелом.

eg 
auckland.ac.nz. 198.19.20.44
www.esc.auckland.ac. 173.27.28.93
stat.auckland.ac.nz. 52.159.152.105
student.auckland.ac.nz. 64.247.240.232

Теперь проблема в том, что как только пользователь заканчивает вводить данные, поток ввода не завершается, и, следовательно, программа не выполняется. Я написал некоторый код для BufferedReader, если кто-нибудь захочет его проверить и сказать мне, где я ошибся, я был бы очень признателен. Обратите внимание на две переменные «count» и «n». Могу ли я использовать их, чтобы помочь с этим?

     try {
        String fqdn, src, key, temp;
        Integer count;
        int n = 0;

        while ((temp = br.readLine()) != null){
            int divide = temp.indexOf(" ");
            fqdn = temp.substring(0, divide); // divide the input 
            src = temp.substring(divide+1);
            key = fqdn + " " + src;
            //System.out.printf("%d: %s\n", n, key);
            dht.lookup(key);
            n += 1;
        } 
        br.close();
    } catch (NoSuchElementException e) {
        //System.out.printf("end-of-file\n");    
    }

person Jay    schedule 03.10.2011    source источник


Ответы (2)


Цикл завершится, когда readLine() вернет null. Единственный способ, которым это произойдет, - это закрыть стандартный ввод. Пользователь может сделать это, набрав Ctrl+D, но это, пожалуй, слишком много для обычного пользователя. Одна простая альтернатива — попросить их напечатать «готово», когда они закончат; тогда ваш цикл должен проверять это значение, а не null.

person Ernest Friedman-Hill    schedule 03.10.2011
comment
Привет, Эрнест. Спасибо за это. На самом деле я собираюсь протестировать его на автоматическом вводе данных пользователем (например, с компьютера, который генерирует ввод), поэтому он не может включать в себя завершение или CTRL -D в конце. Есть ли другой способ? - person Jay; 03.10.2011
comment
@Jay: То, как вы пытаетесь этого добиться, должно иметь указание от пользователя о том, что он завершил отправку ввода. Как завершающий символ/строка или нет. входы должны быть известны и т. д. - person Umer Hayat; 03.10.2011
comment
Я не знаю нет. входов, которые компьютер будет запускать в моем коде, потому что он случайный. Нет ли способа, чтобы он автоматически отключался, когда больше не подается ввод? - person Jay; 03.10.2011
comment
Если программа читает из канала, т. е. java MyClass < file.txt, то она должна работать правильно, как написано; стандартный ввод должен быть закрыт в конце файла. - person Ernest Friedman-Hill; 03.10.2011
comment
А также, как я уже сказал, вы можете написать программу, которая останавливается при вводе сигнального значения (например, слова done). Это работает одинаково для пользовательского ввода или автоматического ввода. - person Ernest Friedman-Hill; 03.10.2011