【问题标题】:JAVA: IO Exception: Reason Stream closedJAVA:IO 异常:原因流已关闭
【发布时间】:2012-09-10 07:21:49
【问题描述】:

为什么会出现以下异常?我正在做的是逐行将一个巨大的 ArrayList 写入磁盘上的文件。生成的文件大约 >700MB。 逐行编写时似乎有一些问题。文件的大小可能是一个原因吗?为什么要关闭流?顺便说一句,我正在使用 Windows 操作系统。

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)

【问题讨论】:

    标签: java file io filewriter bufferedwriter


    【解决方案1】:

    您应该关闭BufferedWriter关闭FileWriter

    而且,结束调用应该在 finally 块中。这是一种方法(最后一种):

    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 了解更多选项)

    还请注意,正如@oldrinb 所述,您不必关闭嵌套流。但我认为无论如何这是一种很好的做法。

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

    【讨论】:

    • 您认为在关闭 FileWriter 之前关闭 BufferedWriter 可以解决我的问题吗?如何在 try-catch-finally 构造中定义 finally?
    • @Bob:我希望如此。请尝试并报告结果:-)
    • 您根本不必关闭FileWriter
    • @oldrinb:谢谢,我对此添加了注释。
    猜你喜欢
    • 2010-09-25
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多