2012-04-15 6 views
0

大きなASCIIテキストファイル(20GB)を1行ずつ読み込み、これらの行の一部を別のファイルにコピーしたいとします。次のコード例は、出力ファイルに書き込むときにデータを失います。私はいくつかのprintlnsとその期待どおりに動作してリーダーをテストしました。私はBufferedWriterのバッファを増やそうとしましたが、改善はありませんでした。また、flush()は機能しませんでした。この場合の出力ファイルは約40MBです。BufferedWriterで書き込み中にデータを失う

私はたぶん、あなたはこのことを意味 はティム

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

forループを使用していて、whileループを使用していないのはなぜですか? –

+0

コピーする必要がある行の情報は、ファイルの最初の行で読み取られます。私はこれが問題に関連していないと考えました。 – timmiotooltim

+0

あなたは、どのようなデータが失われているのか、そしてどこであなたのコードが誤動作しているのかわからないので、*** ***はすべて関連しています。私の経験は、ファイルの行数をどのように計算しているかにかかわらず、whileループを使用してBufferedReaderに行間がなくなったことを伝えることができます。それははるかにばかばかしいことです。 –

答えて

0

挨拶、あなたは私を助けることができると思いますか?

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(); 
} 

ヌルテストを行わないと、EOFは例外をスローします。

+0

そうです、EOFチェックが必要です。しかし、私の現在のケースでは、問題はありません。私はSystem.out.printlnsでデータの読み込みをチェックしました。 – timmiotooltim

+0

readLine()はEOFで例外をスローしません。永遠にnullを返すだけです。 – EJP

+0

@EJPの質問コードで 'readLine()。trim()'が実行されました。これは、ループカウンタがEOFの前にNullPointerExceptionをスローします。 –

関連する問題