解決済み、要するに: 問題は、既に閉じられている 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();
}
ただし、 to を作成するために使用する exact コードを、書き込みの直前にコピーするFileOutputStream
と、期待どおりに機能します。
そのオブジェクトを以前に作成すると例外が発生するのに、使用する直前に作成すると例外が発生しないのはなぜだろうか。
編集:例外:
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)