2010-12-28 7 views
5

Mam duży plik (angielska baza danych artykułów z Wikipedii tylko jako pliki XML). Czytam jedną postać na raz, używając BufferedReader. Pseudokod jest:Metoda gotowa BufferedReader w pętli while do określenia EOF?

file = BufferedReader... 

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

Czy to jest rzeczywiście poprawne? Czy też ready po prostu zwróci false, gdy czeka na HDD, aby zwrócić dane, a nie po osiągnięciu EOF? Próbowałem użyć if (file.read() == -1), ale wydawało mi się, że wpadłem w nieskończoną pętlę, której dosłownie nie mogłem znaleźć.

Zastanawiam się, czy to czyta cały plik, ponieważ moje statystyki mówią, że 44 4 380 stron Wikipedii zostało przeczytanych, ale pomyślałem, że jest o wiele więcej artykułów.

Odpowiedz

2

To nie gwarantuje odczytania całego wejścia. ready() mówi tylko, czy strumień bazowy ma gotową zawartość. Jeśli na przykład jest to wyodrębnianie za pośrednictwem gniazda sieciowego lub pliku, może to oznaczać, że nie ma dostępnych żadnych buforowanych danych, tj. , a także.

9

Metoda Reader.ready() nie jest przeznaczona do testowania końca pliku. Jest to raczej sposób na sprawdzenie, czy wywołanie read() zostanie zablokowane.

Prawidłowym sposobem na wykrycie, że osiągnąłeś EOF, jest zbadanie wyniku połączenia read.

Na przykład, jeśli czytasz znak naraz, metoda read() zwraca int który albo będzie ważny znak lub -1 jeśli już osiągnęły EOF. Twój kod powinien wyglądać tak:

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