Я не получаю ожидаемый результат с использованием readLine () в Java

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

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) или возврата каретки, за которым сразу следует перевод строки.

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

Выдает : IOException- Если происходит ошибка ввода-вывода

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

24.08.2008 13:29:20
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

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

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

java -cp . Echo < test.txt
10
24.08.2008 15:00:43
Функция readLine () возвращает строку плюс символ перевода строки - '\ n' или только строку?
Ashwin 18.05.2012 11:33:44
Из JavaDoc: «Строка, содержащая содержимое строки, не включая символы окончания строки, или ноль, если достигнут конец потока».
Neeme Praks 5.02.2015 07:56:33

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

3
20.08.2015 22:19:55

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

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

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

1
30.08.2008 22:43:46