Ich habe das folgende Problem: Mein Programm ist ein InputStream übergeben, von dem ich den Inhalt nicht kontrollieren kann. Ich entpacke meinen Eingabestrom mithilfe der javax-Bibliothek, die zu Recht Ausnahmen auslöst, wenn der InputStream das Zeichen & nicht gefolgt von "amp;" enthält.Richtiger Weg zum Formatieren eines Eingabestreams
Die Abhilfe, die ich herauskam, war die folgende Klasse zu erstellen:
import java.io.ByteArrayInputStream;
import java.io.FilterInputStream;
import java.io.InputStream;
/**
* Provide an input stream where all & characters are properly encoded as &
*/
public class FormattedStream extends FilterInputStream {
public FormattedStream(InputStream src) {
super(new ByteArrayInputStream(StringUtil.toString(src)
.replace("&", "&").replace("amp;amp;", "amp;").getBytes()));
}
}
Hinweis: StringUtil ist ein einfaches Dienstprogramm, das ich ein Eingangsstrom in einen String abbiegen.
Mit dieser Klasse anstelle rufe ich jetzt die JAXB Unmarshaller mit:
unmarshal(new FormattedStream(inputStream));
statt
unmarshal(inputStream);
Dieser Ansatz funktioniert, aber nicht für ein paar Gründe seltsam erscheinen:
1 - Aufgrund der Einschränkung, dass super das erste Element im Konstruktor sein muss (Einschränkung, die ich trotz allem, was ich darüber gelesen habe, nicht verstehen kann), bin ich gezwungen, all meine Verarbeitung zu machen n eine Zeile, so dass der Code nicht lesbar ist.
2 - in einen String, den gesamten Strom umwandeln und zurück scheint Overkill zu einem Strom
3 - oberhalb Der Code ist leicht in einem falschen, dass ein Strom, enthaltend amp; amp; wird modifiziert, um amp zu enthalten;
Ich konnte 1 durch das Angebot einer FormatInputStream Klasse mit einer Methode bietet:
InputStream preProcess(InputStream inputStream)
wo ich tun würde, die gleichen Operationen, die ich zur Zeit im Konstruktor meiner FormattedStream Klasse tue, aber es scheint seltsam zu wählen eine andere Schnittstelle wegen einer Codierungsbeschränkung.
konnte ich 2 Adresse von meinem FormattedStream Konstruktor einfach zu halten:
super(src)
und Überschreiben der drei Lesemethoden, aber das würde viel mehr Codierung beinhalten: Überschreiben der drei Lesemethoden durch die & ersetzt on the fly nicht ist trivial im Vergleich zu der Ein-Zeile Code, den ich derzeit habe, wo ich die replaceAll String-Methode nutzen kann.
Wie bei 3, so scheint es genug von einer Ecke Fall, dass ich darüber keine Sorge, aber vielleicht sollte ich ...
Vorschläge, wie mein Problem in eine elegantere Weise zu lösen?
Das ist großartig: Danke für das Beispiel. Eine Frage allerdings: Müsstest du nicht die Methode read (byte [], int, int) außer Kraft setzen, damit der Code funktioniert, egal wie auf den Stream zugegriffen wird? – double07
Und übrigens, ich bin an die Quelle des Problems gekommen und versuche es dort zu beheben. – double07