2010-09-15 20 views
8

Mi código debe leerse en todo un archivo. Actualmente estoy usando el siguiente código:¿Cómo ver si un lector está en EOF?

BufferedReader r = new BufferedReader(new FileReader(myFile)); 
while (r.ready()) { 
    String s = r.readLine(); 
    // do something with s 
} 
r.close(); 

Si el archivo está vacío, sin embargo, a continuación, s es nulo, lo que no es bueno. ¿Hay algún Reader que tenga un método atEOF() o equivalente?

Respuesta

1

Un patrón estándar para lo que usted está tratando de hacer es:

BufferedReader r = new BufferedReader(new FileReader(myFile)); 
String s = r.readLine(); 
while (s != null) { 
    // do something with s 
    s = r.readLine(); 
} 
r.close(); 
+4

El método listo() sólo indica si la próxima lectura bloqueará. Si el lector está en eof, la próxima llamada no se bloqueará; volverá inmediatamente con una indicación de EOF (nulo para readline, -1 para lectura). –

+1

Mejor aún: do-while en vez de while. –

+0

El JavaDoc de 'BufferedReader.readLine()' dice que devuelve "Una cadena que contiene el contenido de la línea ... o nulo ** si se ha alcanzado el final de la secuencia **" – Raedwald

0

el método listo() no funcionará. Debe leer de la transmisión y verificar el valor de retorno para ver si está en EOF.

+0

Bueno, * funcionará *, en muchos casos, pero no hará lo necesario para responder esta pregunta. – EJP

3

El docs decir:

public int read() throws IOException
Devuelve: La lectura de caracteres, como un entero en el rango de 0 a 65535 (0x00-0xffff), o -1 si el extremo de la corriente tiene sido alcanzado.

Así, en el caso de un lector se debe comprobar contra EOF como

// Reader r = ...; 
int c; 
while (-1 != (c=r.read()) { 
    // use c 
} 

En el caso de un BufferedReader y readLine(), puede ser

String s; 
while (null != (s=br.readLine())) { 
    // use s 
} 

porque readLine() devuelve nulo en EOF.

0

Utilice esta función:

public static boolean eof(Reader r) throws IOException { 
    r.mark(1); 
    int i = r.read(); 
    r.reset(); 
    return i < 0; 
} 
+0

* Si y solo si * el 'Reader' admite' mark() 'y' reset() '. – EJP

Cuestiones relacionadas