tengo dicho código para leer un archivo de texto usando BufferedReader
:¿El método BufferedReader.ready() asegura que el método readLine() no devuelve NULL?
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 informes una advertencia:
NP_DEREFERENCE_OF_READLINE_VALUE: El resultado de invocar readLine() es dereferenced sin verificando si el resultado es nulo. Si no hay más líneas de texto para leer, readLine() devolverá nulo y desreferenciando que generará un puntero nulo excepción.
Cuando cambio FileReader
-StringReader
, 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 (..)
{
...
}
el método readLine
devuelve null
mientras que el método ready
siempre devuelve true
- de hecho este es un bucle infinito.
esto parece que el readLine
puede volver null
incluso si ready
vuelve true
. ¿Pero por qué el comportamiento difiere para diferentes Reader
s?
ACTUALIZACIÓN:
conozco la forma normal para leer un archivo de texto (al igual que Pedro y Ali ilustrados). pero leí esa parte del código de mi colega y me di cuenta de que no conozco el método ready
. Luego leo el JavaDoc, pero no entiendo block
. Luego hice una prueba y publiqué esta pregunta. Entonces, la mejor manera de plantear esta pregunta podría ser:
¿Cuándo estará bloqueada la entrada? ¿Cómo usar el método ready
(o por qué no usarlo)? ¿Por qué esos 2 Reader
s (FileReader
y StringReader
) se comportan de manera diferente con respecto al método ready
?
Desafortunadamente para readLine(), ready() solo garantiza que un carácter esté disponible, es decir, read() no se bloqueará. readLine() bloqueará si hay datos pero no una línea completa. El código –