it-swarm.com.de

Puffer mit BufferedReader in Java zurücksetzen?

Ich benutze die Klasse BufferedReader, um zeilenweise im Puffer zu lesen. Wenn ich die letzte Zeile im Puffer lese, möchte ich wieder am Anfang des Puffers anfangen zu lesen. Ich habe über mark () und reset () gelesen und bin mir nicht sicher, wie es verwendet wird, aber ich glaube nicht, dass sie mir dabei helfen können.

Weiß jemand, wie man nach Erreichen der letzten Zeile am Anfang des Puffers mit dem Lesen beginnt? Wie können wir seek (0) des RandomAccessFile verwenden? Bitte. Vielen Dank

14
ipkiss

markieren/Zurücksetzen ist das, was Sie möchten, Sie können es jedoch nicht wirklich für den BufferedReader verwenden, da er nur eine bestimmte Anzahl von Bytes (die Puffergröße) zurücksetzen kann. Wenn Ihre Datei größer ist, funktioniert sie nicht. Es gibt keine "einfache" Möglichkeit, dies zu tun (leider), aber es ist nicht zu schwer zu handhaben, Sie brauchen nur einen Griff um den ursprünglichen FileInputStream.

FileInputStream fIn = ...;
BufferedReader bRead = new BufferedReader(new InputStreamReader(fIn));

// ... read through bRead ...

// "reset" to beginning of file (discard old buffered reader)
fIn.getChannel().position(0);
bRead = new BufferedReader(new InputStreamReader(fIn));

(Beachten Sie, dass die Verwendung von Standardzeichensätzen nicht empfohlen wird, sondern nur ein vereinfachtes Beispiel).

35
jtahlborn

Ja, markieren und zurücksetzen sind die Methoden, die Sie verwenden möchten.

// set the mark at the beginning of the buffer
bufferedReader.mark(0);

// read through the buffer here...

// reset to the last mark; in this case, it's the beginning of the buffer
bufferedReader.reset();
3
Greg

Dies funktionierte für mich, um dieses Problem zu lösen. Ich lese in einer Datei Zeile für Zeile. Ich mache sehr früh in meinem Programm einen BufferedReader. Ich überprüfe dann, ob die readLine NULL ist, und führe myFile.close und dann einen neuen BufferedReader aus. Beim ersten Durchlauf wird die readLine-Variable null sein, da ich sie global so eingestellt habe und dann noch keine readLine durchgeführt habe. Die Variable ist global definiert und auf null gesetzt. Infolgedessen kommt es zu einem nahen und neuen BufferedReader. Wenn ich ganz am Anfang meines Programms keinen BufferedReader mache, wirft diese myFile.close beim ersten Durchlauf eine NPE.

Während die Datei Zeile für Zeile durchgelesen wird, schlägt dieser Test fehl, da readLine nicht null ist. Im Test passiert nichts, und der Rest der Dateianalyse wird fortgesetzt.

Wenn später die readLine auf EOF wechselt, wird sie wieder als null bewertet. IE: Beim zweiten Durchlauf dieser Überprüfung werden auch myFile.close und der neue BufferedREader durchgeführt, wodurch die readLine wieder an den Anfang zurückgesetzt wird.

In meiner Schleife oder außerhalb meiner Schleife geschieht diese Aktion nur, wenn die readLine-Variable global auf null gesetzt ist oder bei EOF. In beiden Fällen führe ich einen "Reset" aus, um zum Anfang der Datei zurückzukehren, und einen neuen BufferedReader.

if (readLineOutput == null) { 
//end of file reached or the variable was just set up as null
    readMyFile.close();
    readMyFile = new BufferedReader(new FileReader("MyFile.txt"));
                }
0
JavaNoob