Я не получаю ожидаемый результат с использованием readLine () в Java - PullRequest
5 голосов
/ 24 августа 2008

Я использую фрагмент кода ниже, но он работает не совсем так, как я понимаю.

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Из прочтения Javadoc о readLine() говорится:

Читает строку текста. Строка считается завершенной любым из перевода строки (\n), возврата каретки (\r) или возврата каретки, за которым сразу следует перевод строки.

Returns : String, содержащий содержимое строки, не включая символы окончания строки, или ноль, если достигнут конец потока

Выдает : IOException - При возникновении ошибки ввода / вывода

Насколько я понимаю, readLine должен возвращать ноль при первом вводе ввода, кроме завершения строки, например \r. Однако этот код просто зацикливается бесконечно. После отладки я обнаружил, что вместо нуля, возвращаемого при вводе только символа завершения, он на самом деле возвращает пустую строку (""). Это не имеет смысла для меня. Что я не правильно понимаю?

Ответы [ 3 ]

10 голосов
/ 24 августа 2008

Насколько я понимаю, readLine должен возвращать ноль в первый раз, когда не вводится никакого ввода, кроме окончания строки, например '\ r'.

Это не правильно. readLine вернет null, если достигнут конец потока. Это, например, если вы читаете файл, и файл заканчивается, или если вы читаете из сокета, и сокет закрывается.

Но если вы просто читаете ввод с консоли, нажатие клавиши возврата на клавиатуре не является концом потока. Это просто символ, который возвращается (\n или \r\n в зависимости от вашей ОС).

Итак, если вы хотите разбить как пустую строку, так и конец строки, вы должны сделать:

while (line != null && !line.equals(""))

Кроме того, ваша текущая программа должна работать должным образом, если вы перенаправите какой-то файл прямо в нее, например:

java -cp . Echo < test.txt
3 голосов
/ 24 августа 2008

Нет ввода не совпадает с концом потока. Обычно вы можете смоделировать конец потока в консоли, нажав Ctrl + D (AFAIK некоторые системы используют вместо Ctrl + Z ). Но я думаю, это не то, что вам нужно, поэтому лучше тестируйте пустые строки в дополнение к нулевым.

1 голос
/ 31 августа 2008

Есть хорошая apache commons lang библиотека, в которой есть хороший API для общих действий :). Вы можете использовать статический импорт StringUtils и использовать его метод isNotEmpty (String), чтобы получить:

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

Это может быть полезно когда-нибудь :) В этой библиотеке есть и другие полезные классы.

...