Lesen von einer großen, kontinuierlich wachsenden Datei mit BufferedReader

8

Die Aufgabe besteht darin, Zeile für Zeile durch eine sehr große, kontinuierlich wachsende Datei (etwas effizient) zu lesen. Hier ist im Grunde, was ich gerade mache:

%Vor%

Also hängt mein BufferedReader einfach am Ende der Datei, bis mehr Sachen zu lesen sind. Das funktioniert ziemlich gut, aber es gibt ein Problem - Wenn readLine aufgerufen wird, während der Prozess, der in die Datei schreibt, gerade dabei ist, eine Zeile zu schreiben. Dann gibt der erste Aufruf von readLine den ersten Abschnitt der Zeile zurück, und der nächste Aufruf gibt den zweiten Abschnitt zurück. Aber ich brauche diese beiden Teile wirklich, ich brauche komplette Zeilen.

Genauer gesagt passiert mein Problem, wenn die folgende Verschachtelung von Ereignissen passiert:

  1. Der Schreibprozess schreibt den größten Teil einer Zeile
  2. readLine () heißt
  3. Der Schreibprozess beendet diese Zeile und fügt ein Zeilenvorschubzeichen hinzu
  4. readLine () heißt

Das Ergebnis ist, dass jede readLine () einen Abschnitt der gesamten Zeile, die der Schreibprozess ausgibt, aufnimmt. Es verhält sich wie erwartet, weil es jedes Mal, wenn es aufgerufen wird, das Ende der Datei erreicht und zurückgibt, was es gelesen hat.

Also im Wesentlichen die Funktionalität, die ich brauche, ist ein BufferedReader, der null eine readLine früher zurückgibt; eine, die dir keine Linie gibt, bis es einen Zeilenumbruch gibt, nicht nur EOF danach. Wenn also EOF gefunden wird, gibt es die Zeile nicht bis zu diesem Punkt zurück, es gibt null zurück und gibt diese Zeile zurück, nachdem die Datei geschrieben wurde und eine neue Zeile dahinter steht.

Ich könnte wahrscheinlich eine rohe Methode implementieren, indem ich den FileReader direkter behandele und BufferedReader neu schreibe, aber ich weiß nicht viel darüber, wie man das effizient macht. Meine Implementierung wird wahrscheinlich nicht so schnell sein wie der echte BufferedReader, und ich möchte vermeiden, dass das Programm für die Zeiten verlangsamt wird, wenn Daten gelesen werden sollen.

    
Joe K 08.07.2010, 16:59
quelle

5 Antworten

2

Sie könnten mit der Quelle von BufferedReader beginnen und die String readLine(boolean ignoreLF) Methode, die den Fehler verursacht, wenn EOF vor dem Ende der Zeile gefunden wird. (Leider kann es aufgrund des Paketumfangs nicht eingelernt werden)

    
stacker 08.07.2010, 17:21
quelle
1

BufferedReader soll nicht null zurückgeben, bis das definitive Ende des Streams erreicht ist. Mit anderen Worten, ich würde nicht erwarten, dass jemals nach Rückgabe von null null zurückgibt.

Ich bin ein wenig überrascht, dass es Ihnen teilweise Linien gibt - ich würde erwarten, dass es blockiert, bis es eine volle Linie hat.

    
Jon Skeet 08.07.2010 17:09
quelle
0

Sie könnten Ссылка ausprobieren Es gibt Ihnen die Möglichkeit, zum Anfang einer Zeile zurückzukehren.

    
Romain Hippeau 08.07.2010 17:08
quelle
0

Versuchen Sie immer, die letzte Zeile zurück zu schieben, indem Sie einen Pushback-Reader verwenden.

    
Sualeh Fatehi 08.07.2010 17:23
quelle
0

Wie der Stapler sagte, wäre der beste Weg, eine Klasse zu erstellen, die Bufferedreader erbt. Was ich gefunden habe ist, wenn BufferedReader EOF erreicht hat, ist es ziemlich verloren. Wenn Sie weiterlesen oder nachsehen wollen, ob es neue Sachen gibt, können Sie immer wieder öffnen und überspringen. In der Praxis, wenn Sie genau wissen, wohin Sie springen können, würde es nicht lange dauern. Werfen Sie einen Blick auf die Antwort für diese Frage. Er hat eine reopenat () Funktion auf einem Reader erstellt, so dass der Reader aktualisiert wird.

BufferedReader zurücksetzen fehlgeschlagen nach dem Lesen bis zum Ende der Datei

    
Evilsanta 08.07.2014 21:08
quelle