2010-12-28 11 views
5

Ho un file di grandi dimensioni (articoli di Wikipedia in inglese solo database come file XML). Sto leggendo un personaggio alla volta usando BufferedReader. Lo pseudocodice è:Il metodo BufferedReader ready in un ciclo while per determinare EOF?

file = BufferedReader... 

while (file.ready()) 
    character = file.read() 

È effettivamente valido? Oppure ready restituisce semplicemente false quando è in attesa che l'HDD restituisca i dati e non in realtà quando è stato raggiunto lo EOF? Ho provato a usare if (file.read() == -1) ma sembra che mi sia imbattuto in un loop infinito che non sono riuscito a trovare.

Mi chiedo solo se sta leggendo l'intero file come le mie statistiche dicono che 444.380 pagine di Wikipedia sono state lette ma ho pensato che ci fossero molti più articoli.

risposta

2

Non è garantito la lettura dell'intero input. ready() ti dice solo se lo stream sottostante ha qualche contenuto pronto. Se si sta astringendo su un socket o un file di rete, ad esempio, potrebbe significare che non sono disponibili dati bufferizzati eppure.

9

Il metodo Reader.ready() non è destinato a essere utilizzato per verificare la fine del file. Piuttosto, è un modo per verificare se la chiamata read() verrà bloccata.

Il modo corretto per rilevare che è stato raggiunto EOF è esaminare il risultato di una chiamata read.

Ad esempio, se si sta leggendo un carattere alla volta, il metodo restituisce un read()int che essere un carattere valido o -1 se avete raggiunto la fine del file. Quindi il tuo codice dovrebbe apparire così:

int character; 
while ((character = file.read()) != -1) { 
    ... 
}