Я не получаю ожидаемого результата при использовании 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) или возврат каретки, за которым сразу следует перевод строки.

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

Броски: IOException - Если возникает ошибка ввода / вывода

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
4 568
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Ответ принят как подходящий

From my understanding of this, readLine should return null the first time no input is entered other than a line termination, like '\r'.

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

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

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

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

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

java -cp . Echo < test.txt

Возвращает ли readLine () строку плюс символ перевода строки - '\ n' или только строку?

Ashwin 18.05.2012 15:33

Из JavaDoc: «Строка, содержащая содержимое строки, не включая символы завершения строки, или null, если был достигнут конец потока».

Neeme Praks 05.02.2015 10:56

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

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

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

Другие вопросы по теме