2008-08-24 5 views
4

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

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

Броски: IOException - Если Ошибка ввода-вывода

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

ответ

10

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

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

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

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

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

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

java -cp . Echo < test.txt 
+0

Does readLine() возвращает строку плюс charater строки - '\ n' или только строку? – Ashwin 2012-05-18 11:33:44

3

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

1

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

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

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