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&nbsp;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&nbsp;método retornanull&nbsp;enquanto oready&nbsp;método sempre retornatrue&nbsp;- de fato, este é um loop infinito.

Parece que oreadLine&nbsp;pode retornarnull&nbsp;mesmo seready&nbsp;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&nbsp;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&nbsp;método (ou por que não usá-lo)? Por que aqueles 2Readers (FileReader&nbsp;eStringReader) se comportam de maneira diferente em relação aoready&nbsp;método?