2

次の例外が発生するのはなぜですか? 私がやっていることは、巨大な ArrayList を 1 行ずつディスク上のファイルに書き込んでいることです。生成されるファイルは約 700MB を超えます。行ごとに書くと何か問題があるようです。ファイルのサイズが原因でしょうか? ストリームが閉じられているのはなぜですか? ちなみに、私はWindows OSで作業しています。

FileWriter evaluated_result = 
    new FileWriter(path_output+this.algorithm+"/"+query_type+"/"+"queries.eval");
BufferedWriter out = new BufferedWriter(evaluated_result);
out.write(Myobject);
out.newLine();
evaluated_result.close();
out.close();

例外は次のとおりです。

java.io.IOException: Stream closed
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
    at java.io.BufferedWriter.close(BufferedWriter.java:264)
    at Assignment_1.Query_Evaluator.write100BestDocumentsEvalFormat(Query_Evaluator.java:85)
    at Assignment_1.Experiment.ConductExperiment(Experiment.java:54)
    at Assignment_1.Main.main(Main.java:78)
4

1 に答える 1

7

を閉じるBufferedWriter 前にを閉じる必要がありFileWriterます。

また、最後の呼び出しは finally ブロックにある必要があります。これはそれを行う1つの方法です(最後に1つ):

FileWriter evaluated_result = new FileWriter(path_output+this.algorithm+"/"+query_type+"/"+"queries.eval");
BufferedWriter out = new BufferedWriter(evaluated_result);
try {
  out.write(Myobject);
  out.newLine();
}
finally {
  if (out != null) out.close();
  if (evaluated_result != null) evaluated_result.close();
}

(その他のオプションについては、こちらをご覧ください)

また、@oldrinb で述べたように、ネストされたストリームを閉じる必要がないことに注意してください。しかし、とにかくそれは良い習慣だと思います。

Java 7 では、 try-with-resourcesステートメントを使用できます。

于 2012-09-18T03:43:25.780 に答える