2009-11-16 6 views
5

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()); 
+0

Es sieht aus wie ein großes Problem war, dass eBay sagte, sie gaben mir ein gzip, aber es war eigentlich ein zip. –

Antwort

2

Der folgende Code sollte funktionieren. Denken Sie daran, dass Sie Ausnahmen ordnungsgemäß behandeln müssen.

OutputStream out = null; 
InputStream in = null; 
try { 
    out = /* some output stream */; 
    in = new java.util.GZIPInputStream(/*some stream*/); 
    byte[] buffer = new byte[4096]; 
    int c = 0; 
    while ((c = in.read(buffer, 0, 4096)) > 0) { 
     out.write(buffer, 0, c); 
    } 
} finally { 
    if (in != null) { 
     in.close(); 
    } 
    if (out != null) { 
     out.close(); 
    } 
} 
0

Werfen Sie einen Blick auf GZIPInputStream. Here's an example; Die Klasse behandelt dies sehr transparent, es ist fast keine Arbeit zu verwenden.

+1

Nur Neugier: Warum Explizit 1.4.2? Warum nicht nur das Neueste wie hier verfügbar? http://java.sun.com/javase/6/docs/api/java/util/zip/GZIPInputStream.html – BalusC

+0

Sorry, ich hätte mit "Ich denke zuerst in 1.4.2 verfügbar" gehen sollen. Lass mich das bearbeiten. :-) –

+0

Ich schaue auf GZIPInputStream in dem, was ich gerade arbeite, obwohl ich eine Ausnahme "Nicht im GZIP-Format" bekomme. Ich verstehe das nicht, da ich die Datei auf die Festplatte schreiben kann und es ist eine komprimierte Datei (gzip gemäß der Dokumentation). Ich füge hinzu, was ich zur Zeit (nicht funktioniert) zur Frage habe. –

3

Dekorieren Sie den Eingangsstrom mit einer GZIPInputStream.

InputStream decompressed = new GZIPInputStream(compressed);