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




Нет ввода не то же самое, что конец потока. Обычно вы можете имитировать конец потока в консоли, нажав 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
Из JavaDoc: «Строка, содержащая содержимое строки, не включая символы завершения строки, или null, если был достигнут конец потока».
Есть хорошая библиотека apache commons lang, у которой есть хороший api для обычных :) действий. Вы можете использовать статический импорт StringUtils и использовать его метод isNotEmpty (String), чтобы получить:
while(isNotEmpty(line)) {
System.out.println(line);
line = br.readLine();
}
Когда-нибудь это может пригодиться :) В этой библиотеке есть и другие полезные классы.
Возвращает ли readLine () строку плюс символ перевода строки - '\ n' или только строку?