2010-09-15 17 views
8

Mój kod musi zostać odczytany w całym pliku. Obecnie używam następujący kod:Jak sprawdzić, czy Czytelnik jest w EOF?

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

Jeśli plik jest pusty, choć wtedy s jest null, co nie jest dobre. Czy jest jakiś Reader, który ma metodę atEOF() lub odpowiednik?

Odpowiedz

1

standardowy wzór, co chce zrobić, to:

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

Sposób ready() mówi tylko, czy następny odczyt będzie blokował. Jeśli czytnik znajduje się na eof, następne połączenie nie zostanie zablokowane; powróci natychmiast ze wskazaniem EOF (null dla readline, -1 dla read). –

+1

Jeszcze lepiej: do-while, a nie while. –

+0

JavaDoc z 'BufferedReader.readLine()' mówi, że zwraca "Ciąg zawierający zawartość wiersza ... lub null **, jeśli koniec strumienia został osiągnięty **" – Raedwald

0

metoda ready() nie będzie działać. Musisz przeczytać ze strumienia i sprawdzić wartość zwracaną, aby sprawdzić, czy jesteś w EOF.

+0

Cóż, to * będzie * działało, w wielu przypadkach, ale nie zrobi tego, co jest wymagane do udzielenia odpowiedzi na to pytanie. – EJP

3

docs znaczy:

public int read() throws IOException
zwrócone: Postać odczytu, jako liczbę całkowitą w zakresie od 0 do 65535 (0x00-0xffff) lub -1 koniec Stream został osiągnięty.

Tak więc w przypadku Reader należy sprawdzić przed EOF jak

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

W przypadku BufferedReader i readline(), może to być

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

ponieważ readline() zwraca null na EOF.

0

Użyj tej funkcji:

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

* Jeśli i tylko jeśli * 'Reader' obsługuje' mark() 'i' reset() '. – EJP

Powiązane problemy