4 Stimmen

Wie kann ich eine große Datei schrittweise lesen?

Ich habe einige Probleme beim Lesen einer Datei mit Java. Sie ist absolut riesig (2,5G) und die Anpassung meines Speichers hilft nicht. Die Daten sind alle in einer einzigen Zeile, so dass ich nicht lesen kann es eine Zeile zu einer Zeit. Ich möchte die Datei so lange lesen, bis ich eine bestimmte Zeichenkette finde, z. B. "<|Start|>" oder "<|Ende|>", und dann die Daten zwischen diesen Zeichenketten ausgeben, damit der Speicher geleert wird und ich den Rest der Datei weiter lesen kann. Was ich also im Grunde suche, ist eine Art Lesegerät, das bei einer bestimmten Startzeichenkette zu lesen beginnt und bei einer Stoppzeichenkette aufhört zu lesen. Kann mir jemand helfen?

9voto

Jon Skeet Punkte 1325502

Sie müssen eine Reader (z.B. eine BufferedReader einwickelnd InputStreamReader einwickeln FileInputStream ) und lesen Chunks zu einer Zeit mit read(char[], int, int) o read(char[]) . Es liegt an Ihnen, das Token zu finden - auch in dem Fall, dass es in einem Chunk beginnt und in einem anderen endet. Beachten Sie auch, dass read() füllt den Puffer möglicherweise nicht; Sie müssen den Rückgabewert verwenden, um zu sehen, wie viele Daten tatsächlich in das Array geschrieben wurden.

0 Stimmen

Ich werde für eine Sekunde abgelenkt und Jon Skeet stiehlt mir den Ruhm :(

2voto

McDowell Punkte 105255

Ich würde nachsehen, ob Scanner für Ihre Daten geeignet ist. Sie können die useDelimiter Methode, um die Muster zu ändern, mit denen die Eingabe in Token umgewandelt wird.

-1voto

OscarRyz Punkte 189898

Probieren Sie diesen Pseudocode aus:

 char [] start = {'<','|','s','t','a','r','t','|','>' };

 char [] start = {'<','|','e','n','d','|','>' };

 char [] buff  = new char[9];

 while( true ) {
     char c = readChar();
     if( c  == '<' ) {
         buff = readChars( 9 ) ; 
         if( buff == start ) {
             inside = true ;
             skip( 9 ); // start
         } else if( buff == end )  {
             inside = false;
             skip(7); // end 
         }
      } 
      if( inside ) {
          print( char ) ;
      }
 }

Die Idee ist, zu lesen, bis Sie das Token finden und eine Flagge, wenn die Flagge eingeschaltet ist Sie den Wert zu drucken, wenn Sie das Ende Token finden Sie die Flagge ausschalten.

Es sollte eine Reihe von Möglichkeiten geben, den vorherigen Pseudocode zu kodieren. Ich werde diese Antwort später aktualisieren.

0 Stimmen

Es gibt ein Problem mit diesem Ansatz: Sie können die Zeichenfolge zwischen den Lesevorgängen in der Datei kaputt machen. Z.B.: in einem Puffer kann man etwas wie "blabla<|st" und im anderen "art|>" speichern, so dass es nicht funktioniert.

0 Stimmen

@Kico Lobo: Ich verstehe das Problem nicht (da < nicht an anderer Stelle in der Zeichenkette vorkommt)...

0 Stimmen

Nun, eigentlich taucht es an anderer Stelle im Text auf

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X