2010-09-15 12 views
8

Mein Code muss alle Dateien einlesen. Ich bin den folgenden Code zur Zeit mit:Wie kann man sehen, ob ein Reader auf EOF ist?

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

Wenn die Datei zur Zeit leer ist, aber dann ist s null, was nicht gut ist. Gibt es eine Reader, die eine atEOF() Methode oder gleichwertig hat?

Antwort

1

Ein Standardmuster für das, was Sie zu tun versuchen, ist:

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

Die ready() -Methode sagt nur, ob die nächste Lese blockiert. Wenn der Reader an eof ist, wird der nächste Anruf nicht blockiert; Es wird sofort mit einer EOF-Angabe (Null für Readline, -1 für Read) zurückgegeben. –

+1

Noch besser: Do-While statt While. –

+0

Das JavaDoc von 'BufferedReader.readLine()' sagt, es gibt "Eine Zeichenfolge mit dem Inhalt der Zeile ... oder null ** zurück, wenn das Ende des Streams erreicht wurde" – Raedwald

0

die bereit() Methode wird nicht funktionieren. Sie müssen aus dem Stream lesen und den Rückgabewert überprüfen, um zu sehen, ob Sie sich bei EOF befinden.

+0

Nun, es wird * in vielen Fällen funktionieren, aber es wird nicht das tun, was erforderlich ist, um diese Frage zu beantworten. – EJP

3

Die docs sagen:

public int read() throws IOException
Returns: Das Zeichen zu lesen, als eine ganze Zahl im Bereich von 0 bis 65535 (0x00-0xffff), oder -1, wenn das Ende des Stroms hat erreicht worden.

So im Fall eines Reader ein gegen EOF überprüfen sollten, wie

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

Im Falle eines BufferedReader und readline() kann es

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

weil readline() sein Gibt bei EOF null zurück.

0

Mit dieser Funktion:

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

* Wenn und nur wenn * der 'Reader'' mark() 'und' reset() 'unterstützt. – EJP

Verwandte Themen