2012-09-18 57 views
2

爲什麼我會得到以下異常?我正在做的是將一個巨大的ArrayList逐行寫入一個文件到磁盤上。生成的文件大約大於700MB。 看起來像逐行寫入時會出現一些問題。文件的大小可能是一個原因嗎?河流爲什麼關閉?順便說一下,我正在使用Windows操作系統。JAVA:IO異常:原因流關閉

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) 

回答

7

你應該關閉BufferedWriter之前關閉FileWriter

而且,關閉調用應該在finally塊中。這是爲了做到這一點(有一個最終)的一種方法:即,由@oldrinb提到的,你不必關閉嵌套的流

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

(看here更多選項)

還要注意。但我認爲這是一個很好的做法。

在Java 7中,您可以使用try-with-resources語句。

+0

您是否認爲在關閉FileWriter之前關閉BufferedWriter可以解決我的問題?如何在try-catch-finally構造中最後定義? – Bob

+0

@Bob:我希望如此。請嘗試它並報告結果:-) –

+0

@Bob:添加了一些代碼... –