简单地说,解决了:问题是我写信给已经关闭的FileOutputStream
我注意到了使用FileOutputStream类的一些奇怪的语义。
如果我使用以下代码创建一个FileOutputStream:
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
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代码,它就会像预期的那样工作。
现在我想知道,如果我在前面创建对象,为什么会得到这个异常,但是如果我在使用它之前直接创建它,为什么会得到这个异常呢?
编辑:异常:
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替换为更短的字符串,那么一切都是正确的,然而,我仍然得到了这个异常。
编辑:环境信息:
[~]> 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)发布于 2012-11-15 23:48:25
如果close()函数不止一次被调用,那么这种情况就会发生。我的猜测是,由于某种原因,第二个代码块被多次调用。
为了防止缩进错误,我收到了两条很好的建议:
发布于 2012-11-15 19:44:37
让IOException抱怨流关闭的唯一原因是因为流已经关闭。您必须对代码进行跟踪,以确定在何处发生这种情况。一些不太明显的地方包括对其他方法的调用和finally块的try语句。要寻找的另一件事是将变量astDumpStream重新分配到一个不同的流(在IOException被引发之前就关闭了--甚至可能在第一次分配给astDumpStream之前)。
除非有一个单独的线程在延迟后关闭流,否则时间似乎不相关。
发布于 2014-02-10 15:54:16
第二,Tedd --如果您碰巧使用了带有资源块的嵌套try,以及在try块之外使用流--您也可以在这种情况下运行,因为一旦控件从带有资源块的嵌套try中出来,流将被关闭。
https://stackoverflow.com/questions/13404912
复制相似问题