У меня есть такой код для чтения текстового файла с помощью 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() вернет null и разыменовывает который будет генерировать нулевой указатель исключение.
Когда я меняю 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
s?
UPDATE:
Я знаю нормальный способ чтения текстового файла (как показано на примере Питера и Али). но я прочитал этот фрагмент кода от своего коллеги и понял, что не знаю метода ready
. Затем я прочитал JavaDoc, но не понимаю block
. Затем я сделал тест и разместил этот вопрос. Итак, лучший способ задать этот вопрос:
Когда будет блокироваться вход? Как использовать метод ready
(или почему бы не использовать его)? Почему те 2 Reader
(FileReader
и StringReader
) ведут себя по-разному относительно метода ready
?