У меня есть такой код для чтения текстового файла с помощью 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?