У меня есть такой код для чтения текстового файла, используя BufferedReader
:
BufferedReader reader=null;
try {
reader = new BufferedReader(new FileReader("file1.txt"));
while (reader.ready()) {
final String line = reader.readLine();
System.out.println("<"+line+">");
} catch (..)
{
...
}
Работает правильно, но Findbugs выдает предупреждение:
NP_DEREFERENCE_OF_READLINE_VALUE:
результат вызова readLine () равен
разыменованный без проверки, чтобы увидеть
если результат ноль. Если нет
больше строк текста для чтения, readLine ()
вернет ноль и разыменование
это сгенерирует нулевой указатель
исключение.
Когда я меняю FileReader
на StringReader
, т.е.
BufferedReader reader=null;
try {
reader = new BufferedReader(new StringReader("ABCD"));
while (reader.ready()) {
final String line = reader.readLine();
System.out.println("<"+line+">");
} catch (..)
{
...
}
метод readLine
возвращает null
, а метод ready
всегда возвращает true
- действительно, это бесконечный цикл.
Кажется, что readLine
может вернуть null
, даже если ready
вернет true
. Но почему поведение отличается для разных Reader
с?
UPDATE:
Я знаю нормальный способ чтения текстового файла (как иллюстрировали Питер и Али). но я прочитал этот кусок кода от моего коллеги и понял, что не знаю метод ready
. Затем я читаю JavaDoc, но не понимаю block
. Затем я сделал тест и разместил этот вопрос. Итак, лучший способ задать этот вопрос:
Когда будет блокироваться вход? Как использовать метод ready
(или почему бы не использовать его)? Почему эти 2 Reader
s (FileReader
и StringReader
) ведут себя по-разному в отношении метода ready
?