O método BufferedReader.ready () garante que o método readLine () não retorne NULL?

Eu tenho esse código para ler um arquivo de texto usandoBufferedReader:

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new FileReader("file1.txt"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

Funciona corretamente, mas o Findbugs relata um aviso:

NP_DEREFERENCE_OF_READLINE_VALUE: O resultado da chamada de readLine () é desreferenciado sem verificar se o resultado é nulo. Se não houver mais linhas de texto para ler, readLine () retornará nulo e desreferenciamento que gerarão uma exceção de ponteiro nulo.

Quando eu mudoFileReader paraStringReader, ou seja,

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new StringReader("ABCD"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

areadLine método retornanull enquanto oready método sempre retornatrue - de fato, este é um loop infinito.

Parece que oreadLine pode retornarnull mesmo seready retornatrue. Mas por que o comportamento difere para diferentesReaders?

ATUALIZAR:

Eu sei a maneira normal de ler um arquivo de texto (exatamente como Peter e Ali ilustraram). mas li esse pedaço de código do meu colega e percebi que não conhecia oready método. Então eu li o JavaDoc, mas não entendoblock. Então eu fiz um teste e postei esta pergunta. Portanto, a melhor maneira de fazer essa pergunta pode ser:

Quando a entrada estará bloqueando? Como usar oready método (ou por que não usá-lo)? Por que aqueles 2Readers (FileReader eStringReader) se comportam de maneira diferente em relação aoready método?

questionAnswers(4)

yourAnswerToTheQuestion