решена, Короче говоря, проблема заключалась в том, что я писал в уже закрыт FileOutputStreamFileOutputStream: поток закрыт
Я заметил, что некоторые странные семантику, используя класс 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();
}
Однако если скопировать excact код, который я использую для создания FileOutputStream
непосредственно перед записью на него, он работает так, как ожидалось.
Теперь я задаюсь вопросом, почему я получаю это исключение, если я создаю этот объект раньше, но не если я создаю его непосредственно, прежде чем использовать его.
EDIT: Исключение:
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
чем-то коротким, все будет написано правильно, однако я все равно получаю это исключение.
EDIT: Окружающая среда Информация:
[~]> 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)
Вы действительно не дали нам достаточно кода, чтобы выяснить, где поток закрывается. Мое лучшее предположение заключается в том, что вы вызываете этот второй блок кода более одного раза (поэтому он закрывает его в первый раз и выдает исключение вторым). –
Также создание файла является излишним. FileOutputStream пытается создать файл и только выдает FileNotFoundException, если он не может: http://docs.oracle.com/javase/6/docs/api/java/io/FileOutputStream.html#FileOutputStream%28java.io.File% 29 –
@Brendan Long: Это единственный код, доступ к которому имеет объект FileOutputStream. – smerlin