2012-04-15 11 views
0

Ich möchte eine große ASCII-Textdatei (20 GB) Zeile für Zeile lesen und einen Teil dieser Zeilen in eine separate Datei kopieren. Der folgende Beispielcode verliert Daten beim Schreiben in die Ausgabedatei. Ich habe den Reader mit einigen Druckern getestet und es funktioniert wie erwartet. Ich habe versucht, den Puffer des BufferedWriter zu erhöhen, aber keine Verbesserung. Auch flush() hat nicht funktioniert. Die Ausgabedatei sollte in diesem Fall ungefähr 40 MB groß sein.Verlieren von Daten beim Schreiben mit BufferedWriter

Ich hoffe, dass Sie mir helfen können, Tim Gruß

public void split() throws Exception{ 
    BufferedReader inStream = new BufferedReader(new FileReader("input.txt"));  
    BufferedWriter outStream = new BufferedWriter(new FileWriter("output.txt")); 

    for(int i=0;i<700000;i++){ 
     String tempString = inStream.readLine().trim(); 
     if(doOtherStuff(tempString,i)){ 
      break; 
     } 
     outStream.write(tempString); 
     outStream.newLine(); 
    } 
    inStream.close(); 
    outStream.close(); 
} 
+0

Warum verwenden Sie eine for-Schleife und keine while-Schleife? –

+0

Die Information, wieviele Zeilen ich kopieren muß, wird mit der ersten Zeile der Datei eingelesen. Ich dachte, das ist nicht relevant für das Problem, also kurz gesagt ein bisschen. – timmiotooltim

+0

Sie sagen uns nicht genau, welche Daten verloren gehen oder wo, und Sie wissen nicht, warum Ihr Code sich schlecht benimmt, also ist *** all *** relevant. Ich habe die Erfahrung gemacht, dass Sie unabhängig davon, wie viele Zeilen die Datei enthält, eine while-Schleife besser verwenden und den BufferedReader Sie wissen lassen kann, wenn keine Zeilen mehr zu lesen sind. Es ist viel mehr idiotensicher. –

Antwort

0

Vielleicht bedeutete Sie das?

for (;;) { 
    String tempString = inStream.readLine(); 
    if (tempString == null) 
     break; 
    tempString = tempString.trim(); 
    if(doOtherStuff(tempString,i)){ 
     continue; // Skip writing, continue with next line 
    } 
    outStream.write(tempString); 
    outStream.newLine(); 
} 

Ohne den Null-Test löst EOF eine Ausnahme aus.

+0

Sie haben Recht, eine EOF-Prüfung ist notwendig. Aber in meinem aktuellen Fall ist es nicht das Problem, da ich die eingelesenen Daten mit System.out.printlns – timmiotooltim

+0

gelesen habe readLine() wirft keine Ausnahme bei EOF. Es bleibt immer null für immer. – EJP

+0

@EJP im Frage-Code wurde eine 'readLine() .trim()' gemacht, die eine NullPointerException - wenn EOF vor Schleifenzähler wirft. –

Verwandte Themen