Hi,
mit Streams ist es immer ein bischen frickelig. Macht Sinn sich da die Kapitel über Streams/Readers durchzulesen. Im Handbuch der Javaprogrammierung (
www.javabuch.de) wären das Kapitel 18 und 19. Les einfach solange, bis es zu langweilig sind. Die wichtigsten Sachen stehen oben. Ich muß das öfters mal nachlesen, obwohl ich schon viel mit Streams/Readers gemacht habe.
Java kennt bzgl. Streams 2 unterschiedliche Typen.
Byte orientiert Streams und character orientierte Streams. Die Namen der letzteren enden meist mit Reader oder Writer.
Byte orientierte Streams lesen/schreiben 1 byte je read().
Character orientierte Steams lesen/schreiben 1 character je read().
Character orientierte Streams haben immer ein encoding. Physisch liegen ja die Daten immer als Bytes vor. Characters sind eine Abstraktion, die ein Encoding Schema zwingend erfordert. Erst dann weiss der Character-orientierte Stream auf welche Characters sich die physischen Bytes mappen.
Offenbar benutzt build(InputStream) von org.jdom.input.SAXBuilder das in <?xml?> stehende encoding. Wenn nix da ist, scheint er UTF-8 zu benutzten (Fehlermeldung: Malformed UTF-8 char). Das verstehe ich nicht. Vorallem weil das mit dem ByteArrayInputStream da nicht reinläuft. Er benutzt dann die Methode build (Reader von org.jdom.input.SAXBuilder (eine überladene Methode).
Aber jetzt etwas völlig anderes: Man sollte das nicht in einem String zwischenspeichern.
Streams sind gerichtete Ströme von Bytes, die von einer Quelle lesen und in ein Ziel schreiben.
Der DxlExporter erzeugt einen Stream. Du richtest diesen Stream in einen String. Diesen String benutzt du als Quelle für einen neuen Stream, der vom JDOM Parser als input verwendet wird. Das Erzeugen dieses 2ten Streams beansprucht viele Ressourcen (inperformant). Ich seh aber z.Zt auch keine Möglichkeit aus DxlExporter direkt einen Stream zu bekommen (Skandal).
In der Hilfe benutzen die
stream.writeText(exporter.exportDxl(nc))
Nicht gut, dass das zwischendurch in einem String geschrieben wird. Ausserdem funktioniert das nicht bei sehr großen Dokumenten, weil der gesamte String auf einmal in den Speicher geladen wird. Mit Streams geht das nämlich häpchenweise.
Streams müssen immer geschlossen werden!!! Nach jdoc.builder.build(bais) IN JEDEM FALL ein bais.close();
Oder eigentlich ca. so:
ByteArrayInputStream bais = null;
try {
DxlExporter dxl=s.createDxlExporter();
dxl.setOutputDOCTYPE(false);
String outstring=dxl.exportDxl(doc);
InputStream bais = new ByteArrayInputStream( outstring.getBytes() );
SAXBuilder builder = new SAXBuilder();
jdoc = builder.build(bais);
} catch (Exception e) {
e.printStckTrace();
} finally {
if (bais != null) {
try {
bais.close();
} catch(Exception e) {}
}
Werd die offnenen Fragen noch mal genauer prüfen.
Gruß Axel