Сведения о вопросе

Junior

10:18, 3rd August, 2020

Теги

java   java-io    

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

Просмотров: 419   Ответов: 3

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

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();
    }
}

От чтения документации об readLine() он говорит:

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

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

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

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



  Сведения об ответе

baggs

16:02, 18th August, 2020

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

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

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

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

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

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

java -cp . Echo < test.txt


  Сведения об ответе

$DOLLAR

21:06, 1st October, 2020

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


  Сведения об ответе

davran

04:23, 6th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться