2010-09-15 9 views
8

Il mio codice deve essere letto in tutto il file. Attualmente sto usando il seguente codice:Come verificare se un lettore è in EOF?

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

Se il file è vuoto, anche se, poi s è nullo, il che non va bene. C'è uno Reader che ha un metodo atEOF() o equivalente?

risposta

1

Un modello standard per ciò che si sta cercando di fare è:

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

Il metodo pronto() dice solo se la prossima lettura bloccherà. Se il Reader è in eof la prossima chiamata non bloccherà; ritornerà immediatamente con un'indicazione EOF (null per readline, -1 per read). –

+1

Ancora meglio: do-while invece di while. –

+0

Il JavaDoc di 'BufferedReader.readLine()' dice che restituisce "Una stringa contenente il contenuto della linea ... o null ** se è stata raggiunta la fine del flusso **" – Raedwald

0

il metodo pronto() non funzionerà. È necessario leggere dallo stream e controllare il valore restituito per vedere se ci si trova in EOF.

+0

Beh, * funzionerà *, in molti casi, ma non farà ciò che è necessario per rispondere a questa domanda. – EJP

3

Il docs fare:

public int read() throws IOException
ritorni: Il personaggio leggere, come un numero intero nell'intervallo da 0 a 65535 (0x00-0xffff), oppure -1 se la fine del flusso ha stato raggiunto

Quindi, nel caso di un lettore si dovrebbe verificare contro EOF come

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

Nel caso di un BufferedReader e readLine(), può essere

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

perché readLine() restituisce null su EOF.

0

Usare questa funzione:

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

* Se e solo se * il 'Reader' supporta' mark() 'e' reset() '. – EJP

Problemi correlati