2010-12-28 5 views
5

Ich habe eine große Datei (Englisch Wikipedia Artikel nur Datenbank als XML-Dateien). Ich lese jeweils ein Zeichen mit BufferedReader. Der Pseudocode ist:BufferedReader-ready-Methode in einer while-Schleife, um EOF zu bestimmen?

Ist das tatsächlich gültig? Oder wird ready nur false zurück, wenn es wartet auf die HDD Daten zurückzukehren und nicht wirklich, wenn die EOF erreicht? Ich habe versucht, if (file.read() == -1) zu verwenden, aber schien in eine Endlosschleife zu laufen, die ich buchstäblich nicht finden konnte.

ich gerade frage mich, ob es die ganze Datei liest, wie meine Statistiken sagen, 444.380 Wikipedia-Seiten gelesen wurden, aber ich dachte, dass es viele weitere Artikel waren.

Antwort

2

Es wird nicht garantiert, dass der gesamte Eingang gelesen wird. ready() sagt Ihnen nur, ob der zugrunde liegende Stream etwas Inhalt bereithält. Wenn es über eine Netzwerkbuchse oder eine Datei zu abstrahieren, zum Beispiel, könnte es bedeuten, dass es keine gepufferten Daten verfügbar noch ist.

9

Die Methode Reader.ready() ist nicht zum Testen auf Dateiende vorgesehen. Es ist vielmehr eine Möglichkeit zu testen, ob der Aufruf von read() blockiert wird.

Der richtige Weg zu erkennen, dass Sie EOF erreicht haben, ist das Ergebnis eines read Aufruf zu untersuchen.

Zum Beispiel, wenn Sie ein Zeichen zu einem Zeitpunkt zu lesen, die read() Methode gibt ein int, die entweder wird ein gültiges Zeichen oder -1, wenn Sie die End-of-Datei erreicht haben. Daher sollten Sie den Code wie folgt aussehen:

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