Hallo zusammen,
ich betreibe ein Programm, das XML-Dateien über eine beliebige Schnittstelle (z.B. von Platte oder über einen http-Request) in Form eines InputStreams einliest und weiterverarbeitet. Da bestimmte in diesen Dateien enthaltene Zeichen transformiert werden sollen, habe ich einen XmlInputStreamReader (abgeleitet von InputStreamReader) geschrieben, der diese Transformationsregeln implementiert. Soweit alles okay.
Leider liegen nicht alle XML-Dateien im gleichen Encoding vor. Die Dateien können UTF-8 oder ANSI (ISO-8859-1) kodiert sein. Herausbekommen kann ich das Encoding prinzipiell nur anhand des XML-Headers am Anfang des eingelesenen Datenstroms. Das Encoding muss ich der Superklasse meines XmlInputStreamReaders mitliefern, damit mir der Parser zum späteren Zeitpunkt die Daten des XMLs vernünftig zurückliefert.
Und genau hier liegt mein Problem! Ich muss beim Instanziieren meines XmlInputStreamReaders dem Konstruktor das Encoding mitliefern, zu einem Zeitpunkt, an dem ich noch gar nicht angefangen habe, den Inhalt meines InputStreams auszulesen. Hier mal der passende Quellcode dazu:
Ein Henne-Ei-Problem! Ich kann meinen Reader nicht instanziieren, weil ich auf den Inhalt des Streams zugreifen muss, um die notwendigen Encoding-Informationen zu bekommen. Ein nachträgliches Setzen des Encodings ist in der Superklasse InputStreamReader offenbar nicht vorgesehen.
Erschwerend kommt hinzu, dass das Programm relativ performanzkritisch ist. Es werden viele Tausend XML-Dateien (zum Teil mit Volumina > 200 MB) sequentiell verarbeitet. Ich schätze also, dass das naheliegende Vorgehen
1. Stream "anlesen"
2. Encoding ermitteln
3. Stream wegwerfen und neu von der Schnittstelle beziehen
4. XmlInputStreamReader mit jeweiligem Encoding instanziieren
aus Gründen der Performanzerhaltung in meinem Fall nicht zielführend ist.
Lange Rede kurzer Sinn: Fällt jemandem zu meinem Problem eine elegante Lösung ein?
ich betreibe ein Programm, das XML-Dateien über eine beliebige Schnittstelle (z.B. von Platte oder über einen http-Request) in Form eines InputStreams einliest und weiterverarbeitet. Da bestimmte in diesen Dateien enthaltene Zeichen transformiert werden sollen, habe ich einen XmlInputStreamReader (abgeleitet von InputStreamReader) geschrieben, der diese Transformationsregeln implementiert. Soweit alles okay.
Leider liegen nicht alle XML-Dateien im gleichen Encoding vor. Die Dateien können UTF-8 oder ANSI (ISO-8859-1) kodiert sein. Herausbekommen kann ich das Encoding prinzipiell nur anhand des XML-Headers am Anfang des eingelesenen Datenstroms. Das Encoding muss ich der Superklasse meines XmlInputStreamReaders mitliefern, damit mir der Parser zum späteren Zeitpunkt die Daten des XMLs vernünftig zurückliefert.
Und genau hier liegt mein Problem! Ich muss beim Instanziieren meines XmlInputStreamReaders dem Konstruktor das Encoding mitliefern, zu einem Zeitpunkt, an dem ich noch gar nicht angefangen habe, den Inhalt meines InputStreams auszulesen. Hier mal der passende Quellcode dazu:
Java:
public class XmlInputStreamReader extends InputStreamReader {
(...)
public XmlInputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException
{
super(in, charsetName);
}
(...)
}
Ein Henne-Ei-Problem! Ich kann meinen Reader nicht instanziieren, weil ich auf den Inhalt des Streams zugreifen muss, um die notwendigen Encoding-Informationen zu bekommen. Ein nachträgliches Setzen des Encodings ist in der Superklasse InputStreamReader offenbar nicht vorgesehen.
Erschwerend kommt hinzu, dass das Programm relativ performanzkritisch ist. Es werden viele Tausend XML-Dateien (zum Teil mit Volumina > 200 MB) sequentiell verarbeitet. Ich schätze also, dass das naheliegende Vorgehen
1. Stream "anlesen"
2. Encoding ermitteln
3. Stream wegwerfen und neu von der Schnittstelle beziehen
4. XmlInputStreamReader mit jeweiligem Encoding instanziieren
aus Gründen der Performanzerhaltung in meinem Fall nicht zielführend ist.
Lange Rede kurzer Sinn: Fällt jemandem zu meinem Problem eine elegante Lösung ein?