Я не получаю в результате я Ожидать с помощью Readline () в Java

голоса
4

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

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. Тем не менее, этот код только заканчивается цикл бесконечно. После отладки, я обнаружил , что вместо NULL возвращается , если только прекращение символ введен, он фактически возвращает пустую строку ( «»). Это не имеет смысла для меня. Что я не правильно понять?

Задан 24/08/2008 в 14:29
источник пользователем
На других языках...                            


3 ответов

голоса
10

Из моего понимания этого, Readline должен возвращать нуль в первый раз входного сигнала не вводится, кроме прекращения линии, как «\ г».

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

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

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

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

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

java -cp . Echo < test.txt
Ответил 24/08/2008 в 14:41
источник пользователем

голоса
3

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

Ответил 24/08/2008 в 14:32
источник пользователем

голоса
1

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

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

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

Ответил 30/08/2008 в 23:43
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more