¿El método BufferedReader.ready () garantiza que el método readLine () no devuelva NULL?

Tengo dicho código para leer un archivo 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 correctamente pero Findbugs informa una advertencia:

NP_DEREFERENCE_OF_READLINE_VALUE: el resultado de invocar readLine () se desreferencia sin verificar si el resultado es nulo. Si no hay más líneas de texto para leer, readLine () devolverá nulo y desreferencia que generará una excepción de puntero nulo.

Cuando cambioFileReader aStringReader, es decir,

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

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

elreadLine método devuelvenull mientras que lareadyl método @ siempre devuelvetrue - de hecho, este es un bucle infinito.

Esto parece que elreadLine puede devolvernull incluso siready devolucionestrue. Pero, ¿por qué el comportamiento difiere para diferentesReaders?

ACTUALIZAR

Conozco la forma normal de leer un archivo de texto (tal como lo ilustraron Peter y Ali). pero leí ese fragmento de código de mi colega y me di cuenta de que no conozco elready método. Luego leí el JavaDoc, pero no entiendoblock. Luego hice una prueba y publiqué esta pregunta. Entonces, la mejor manera de hacer esta pregunta podría ser:

¿Cuándo se bloqueará la entrada? Cómo usar laready método (o por qué no usarlo)? ¿Por qué esos 2Readers FileReader yStringReader) se comportan de manera diferente con respecto a laready método?

Respuestas a la pregunta(4)

Su respuesta a la pregunta