Ich rufe einen Dienst, der eine gezippte Datei zurückgibt. Ich habe die Daten als InputStream (mit freundlicher Genehmigung von javax.activation.DataHandler.getInputStream();
) aus der Antwort.Wie bekomme ich den InputStream von dekomprimierten Daten aus einem InputStream von GZIPed Daten?
Was ich tun möchte, ist, ohne etwas auf die Festplatte zu schreiben, einen InputStream der dekomprimierten Daten in der Datei, die im Archiv ist. Die komprimierte Datei ist in diesem Fall ein XML-Dokument, das ich unter Verwendung von javax.xml.bind.Unmarshaller
, das einen InputStream verwendet, zu entpacken versuche.
Ich versuche derzeit, den InputStream in einen OutputStream zu schreiben (Dekomprimierung der Daten) und dann muss ich es zurück in einen InputStream schreiben. Es funktioniert noch nicht, also dachte ich, ich würde sehen, ob es einen besseren (ich hoffe) Ansatz geben würde.
Ich kann den ursprünglichen InputStream auf Festplatte schreiben und eine gz-Datei abrufen, und dann diese Datei lesen, die komprimierte Datei daraus holen und von dort gehen, aber ich würde lieber alles im Speicher behalten.
Update 1: Hier ist meine aktuelle (nicht arbeiten - bekommen ein „Nicht im GZIP-Format“ Ausnahme):
ByteArrayInputStream xmlInput = null;
try {
InputStream in = dh.getInputStream(); //dh is a javax.activation.DataHandler
BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int bytes_read = 0;
byte[] dataBuf = new byte[4096];
while ((bytes_read = bis.read(dataBuf)) != -1) {
bo.write(dataBuf, 0, bytes_read);
}
ByteArrayInputStream bin = new ByteArrayInputStream(bo.toByteArray());
GZIPInputStream gzipInput = new GZIPInputStream(bin);
ByteArrayOutputStream out = new ByteArrayOutputStream();
dataBuf = new byte[4096];;
bytes_read = 0;
while ((bytes_read = gzipInput.read(dataBuf)) > 0) {
out.write(dataBuf, 0, bytes_read);
}
xmlInput = new ByteArrayInputStream(out.toByteArray());
Wenn stattdessen auf eine ByteArrayOutputStream des Schreibens ich zu einem Outputstream ich das erste Mal schreiben um bekomme eine komprimierte Datei (die ich manuell öffnen kann, um die XML-Datei zu erhalten) und der Dienst (eBay) sagt, es sollte eine gzip-Datei sein, deshalb bin ich mir nicht sicher, warum ich den Fehler "Nicht im GZIP-Format" erhalte.
Update 2: Ich habe versucht, etwas ein wenig anders - der gleiche Fehler ("Nicht im GZIP-Format"). Wow, ich habe gerade versucht, diese Klammer mit einem Semikolon zu beenden. Wie auch immer, hier ist mein zweiter Versuch, der immer noch nicht funktioniert:
ByteArrayInputStream xmlInput = null;
try {
GZIPInputStream gzipInput = new GZIPInputStream(dh.getInputStream());
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int bytes_read = 0;
byte[] dataBuf = new byte[4096];
while ((bytes_read = gzipInput.read(dataBuf)) != -1) {
bo.write(dataBuf, 0, bytes_read);
}
xmlInput = new ByteArrayInputStream(bo.toByteArray());
Es sieht aus wie ein großes Problem war, dass eBay sagte, sie gaben mir ein gzip, aber es war eigentlich ein zip. –