¿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 laready
l 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 diferentesReader
s?
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 2Reader
s FileReader
yStringReader
) se comportan de manera diferente con respecto a laready
método?