Frage

Im Moment habe ich 2 BufferedReaders auf der gleichen Textdatei initialisiert. Wenn ich fertig bin die Textdatei mit dem ersten BufferedReader Lesen, verwende ich die zweiten einen zweiten Durchlauf durch die Datei von oben zu machen. Mehrere Durchgänge durch die gleiche Datei erforderlich sind.

ich über reset() wissen, aber es muss mit Aufruf mark() und mark() die Größe der Datei wissen muss vorangestellt werden, etwas, was ich nicht glaube, ich muss sollte mit Mühe.

Ideen? Pakete? Libs? Code?

Danke TJ

War es hilfreich?

Lösung

Was ist der Nachteil der gerade einen neuen BufferedReader Schaffung von oben zu lesen? Ich würde das Betriebssystem erwarten, dass die Datei in dem Cache, wenn es klein genug ist.

Wenn Sie über die Leistung besorgt sind, haben Sie es erwies sich als ein Engpass zu sein? Ich würde nur die einfachste Sache tun und nicht darum kümmern, bis Sie einen bestimmten Grund zu haben. Ich meine, Sie könnten nur die ganze Sache in dem Speicher geladen und führen Sie dann die zwei Durchgänge auf dem Ergebnis, aber wieder das wird komplizierter sein als nur von Anfang an zu lesen wieder mit einem neuen Leser.

Andere Tipps

Die gepufferte Leser sollen eine Datei sequentiell lesen. Was Sie suchen ist die java.io.RandomAccessFile , und dann können Sie seek() Sie nehmen verwenden, wo Sie in der Datei möchten.

Der Random Access Leser wird wie so implementiert:

try{
     String fileName = "c:/myraffile.txt";
     File file = new File(fileName);
     RandomAccessFile raf = new RandomAccessFile(file, "rw");
     raf.readChar();
     raf.seek(0);
} catch (FileNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
} catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}

Der "rw" ist ein Modus, Charakter, ist detaillierte hier .

Der Grund, der sequentielle Zugriff Leser sind wie diese Einrichtung so ist, dass sie ihre Puffer umsetzen können und dass die Dinge nicht unter ihren Füßen verändert werden. Zum Beispiel der Dateileser, der mit dem gepufferten Leser gegeben wird, sollen nur von diesem gepufferten Leser betrieben werden. Wenn es eine andere Lage ist, dass könnte es Auswirkungen auf inkonsistenten Betrieb haben könntest als ein Leser seine Position im Dateileser vorgeschoben, während die andere wollten es jetzt gleich bleiben verwenden Sie die anderen Leser, und es ist in einem unbestimmten Ort.

Der beste Weg zu gehen ist Ihren Algorithmus zu ändern, in einer Art und Weise, in der Sie den zweiten Durchgang nicht brauchen. Ich habe diesen Ansatz ein paar Mal, als ich mit großen zu tun hatte (aber nicht so schlimm, das heißt wenige GBs) Dateien, die nicht die verfügbaren Speicher passen.

Es könnte schwierig sein, aber die Performance-Gewinn in der Regel lohnt sich der Aufwand

über die Marke / Reset:

Die Markierung Methode in BufferedReader nimmt einen readAheadLimit Parameter, die begrenzt, wie weit man nach einer Markierung lesen kann, bevor Reset unmöglich wird. Zurücksetzen bedeutet nicht eigentlich ein Dateisystem suchen (0), es sucht gerade innerhalb des Puffers. Um es mit dem Javadoc:

  

readAheadLimit - Begrenzung der Anzahl der Zeichen, die noch gelesen werden können, während die Marke zu erhalten. Nachdem so viele Zeichen zu lesen, versucht der Strom ausfallen kann zurückgesetzt werden. Ein Grenzwert größer als die Größe des Eingangspuffers wird ein neuer Puffer zu veranlassen, deren Größe zugeordnet werden soll, nicht kleiner als Grenze. Daher große Werte sollten mit Vorsicht verwendet werden.

"Die ganze Sache über Zeichen () und reset () in BufferedReader dem schlechten Design schmatzt."

, warum Sie nicht diese Klasse erweitern und haben sie eine Marke tun () im Konstruktor () und führen Sie dann versuchen, eine (0) in topOfFile () -Methode.

BR,
~ A

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top