首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileOutputStream:流关闭

FileOutputStream:流关闭
EN

Stack Overflow用户
提问于 2012-11-15 19:42:13
回答 3查看 9.3K关注 0票数 0

简单地说,解决了:问题是我写信给已经关闭的FileOutputStream

我注意到了使用FileOutputStream类的一些奇怪的语义。

如果我使用以下代码创建一个FileOutputStream:

代码语言:javascript
复制
try {
    File astDumpFile = new File(dumpASTPath);
    if(!astDumpFile.exists()) {
        astDumpFile.createNewFile();
    }
    astDumpStream = new FileOutputStream(dumpASTPath);
} catch( IOException e ) {
    dumpAST = false;
    //throw new IOException("Failed to open file for dumping AST: " + dumpASTPath);
    System.out.println("Failed to open file for dumping AST: " + dumpASTPath);
}

在程序开始时(astDumpStream是一个成员变量)。然后,如果我稍后(~3秒后)将字符串数据写入文件,我将得到一个IOException: stream closed

代码语言:javascript
复制
try {
    String dotGraph = gpvisitor.getDotGraph();
    astDumpStream.write(dotGraph.getBytes("UTF8"));
    astDumpStream.flush();
    astDumpStream.close();
} catch( IOException e ) {
    System.out.println("Failed to dump AST to file: " + e.getMessage());
    e.printStackTrace();
}

但是,如果我在编写FileOutputStream之前直接复制用于创建的excact代码,它就会像预期的那样工作。

现在我想知道,如果我在前面创建对象,为什么会得到这个异常,但是如果我在使用它之前直接创建它,为什么会得到这个异常呢?

编辑:异常:

代码语言:javascript
复制
java.io.IOException: Stream Closed
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:305)
    at MyClass.function(MyClass.java:208)

我只是注意到,即使我得到了一个异常,仍然有一些数据被写入文件。有趣的是,第一行是完全写入的,然后除最后一行之外,其余所有行都将丢失。如果我将编写的字符串dotGraph替换为更短的字符串,那么一切都是正确的,然而,我仍然得到了这个异常。

编辑:环境信息:

代码语言:javascript
复制
[~]> lsb_release -a
Distributor ID: Debian
Description:    Debian GNU/Linux testing (wheezy)
Release:        testing
Codename:       wheezy
[~]> java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-15 23:48:25

如果close()函数不止一次被调用,那么这种情况就会发生。我的猜测是,由于某种原因,第二个代码块被多次调用。

为了防止缩进错误,我收到了两条很好的建议:

  • 总是不断地缩进。最好使用一个为您做这件事的工具(比如Eclipse)。
  • 总是使用花括号,即使你不认为你需要它们。这有助于防止相当多的小错误,这些小错误要花很长时间才能找到,因此,键入每一个bug所需的额外半秒时间,都是由您不需要花费的时间来查找这些bug所造成的。
票数 1
EN

Stack Overflow用户

发布于 2012-11-15 19:44:37

IOException抱怨流关闭的唯一原因是因为流已经关闭。您必须对代码进行跟踪,以确定在何处发生这种情况。一些不太明显的地方包括对其他方法的调用和finally块的try语句。要寻找的另一件事是将变量astDumpStream重新分配到一个不同的流(在IOException被引发之前就关闭了--甚至可能在第一次分配给astDumpStream之前)。

除非有一个单独的线程在延迟后关闭流,否则时间似乎不相关。

票数 4
EN

Stack Overflow用户

发布于 2014-02-10 15:54:16

第二,Tedd --如果您碰巧使用了带有资源块的嵌套try,以及在try块之外使用流--您也可以在这种情况下运行,因为一旦控件从带有资源块的嵌套try中出来,流将被关闭。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13404912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档