Prozess kann nicht auf Datei zugreifen nach XML-Generierung

Paranoia

Erfahrenes Mitglied
Hallo

Ich habe mir in einer Anwendung einen Code zum generieren einer XML-Datei geschrieben:

Code:
// Initialisieren
StreamResult          streamResult = new StreamResult(<Pfad>);
SAXTransformerFactory tf           = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
TransformerHandler    hd           = tf.newTransformerHandler();
Transformer           serializer   = hd.getTransformer();
AttributesImpl        atts         = new AttributesImpl();


// Output Properties festlegen
serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");

// Result festlegen und XML Erzeugung starten
hd.setResult(streamResult);
hd.startDocument();
.
.
.
hd.endDocument();

Dieser Code-Ausschnitt erzeugt so nur eine Zeile in einer XML-Datei, was aber reicht, um mein Problem darzustellen.
Code:
<?xml version="1.0" encoding="UTF-8"?>

Mein Code läuft ansich fehlerfrei durch und generiert meine XML-Datei zu vollster Zufriedenheit. Nun aber zu meinem Problem: Möchte ich mit einem anderen Programm auf diese generierte Datei zugreifen, erhalte ich die Fehlermeldung Der Prozess kann nicht auf die Datei "<Pfad>" zugreifen, da sie von einem anderen Prozess verwendet wird. Dies tritt nur ein, wenn ich meine Java-Anwendung geöffnet habe. Sobald ich die XML-erzeugende Anwendung schliesse, kann ich ohne Schwierigkeiten auf die XML-Datei zugreifen. Auch im Windows-Explorer habe ich die gleichen Vorkommen.

Kann mir jemand weiterhelfen, wie ich dieses Problem lösen könnte? Ich habe schon lange im Internet nach einer Lösung gesucht, aber leider ohne Erfolg :(

Ich bedanke mich bereits jetzt für ein paar wertvolle Tipps ;)
 
Eigentlich sollten die Streams "automatisch" geschlossen werden bzw. besitzt die Klasse StreamResult keine Methode zum Schliessen eines Streams.

Ich habe nun aber herausgefunden, dass ich das Problem umgehen kann, wenn ich ein FileOutputStream benutze. Diesen kann ich explizit schliessen.

Die ersten Zeilen meines Codes würden nun also wie folgt aussehen:
Code:
// Initialisieren
OutputStream          os           = new FileOutputStream(<Pfad>);
StreamResult          streamResult = new StreamResult(os);
SAXTransformerFactory tf           = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
TransformerHandler    hd           = tf.newTransformerHandler();
Transformer           serializer   = hd.getTransformer();
AttributesImpl        atts         = new AttributesImpl();

Am Ende kann das OutputStream mit
Code:
os.close();
geschlossen werden.
 
Zurück