9
votes

Comment puis-je obtenir l'intrigue des données décompressées à partir d'une inputtream de données gziped?

J'appelle un service qui renvoie un fichier gzippé. J'ai les données comme une intrigue (avec la courtoisie de javax.activation.datahahnandler.getinputStream (); code>) à partir de la réponse.

Ce que je voudrais faire est, sans rien écrire sur le disque, obtenez une intrigue des données décompressées dans le fichier dans l'archive. Le fichier compressé dans ce cas est un document XML que j'essaie de mobilalhal en utilisant javax.xml.bind.unmarshaller code> qui prend une intrigue. P>

Je tente actuellement d'écrire l'intrigue à une sortie de sortie (décompresser les données), puis je devrai l'écrire sur une intrigue. Ça ne marche pas encore, je pensais que je verrais que je verrais s'il y avait une approche meilleure (j'espère). P>

Je peux écrire l'intrigue initiale sur disque et obtenir un fichier GZ, puis lisez ce fichier, puis lisez ce fichier, puis lisez ce fichier, puis lisez ce fichier, Obtenez le fichier compressé en dehors de celui-ci et passez à partir de là, mais je préfère le maintenir tout en mémoire est possible. p>

Mise à jour 1: Voici mon article actuel (ne fonctionne pas - Obtenez un "Pas en format gzip" Exception): P>

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


1 commentaires

On dirait qu'un gros problème était que Ebay a dit qu'ils me donnaient une gzip mais c'était en fait un zip.


3 Réponses :


0
votes

Jetez un coup d'oeil à gzipinputtream. Voici un exemple ; La classe gère cela très de manière transparente, il n'est presque pas de travail à utiliser.


4 commentaires

Juste curiosité: pourquoi expliter l'explication 1.4.2? Pourquoi pas seulement le dernier comme disponible ici? Java.sun.com/javase/6/ Docs / API / Java / Util / Zip / ...


Désolé, j'aurais dû aller avec "Je pense d'abord être disponible en 1.4.2". Laissez-moi éditer celui-là. :-)


Je regarde GzipInputStream dans ce que je travaille actuellement avec bien que je reçois une exception "non au format gzip". Je ne comprends pas cela comme je peux écrire le fichier sur le disque et il s'agit d'un fichier compressé (GZIP selon la documentation). Je vais ajouter ce que je (ne fonctionne pas) a à la question.


Il peut s'agir d'un format zip clair au lieu de gzip? Essayez également ZipInputStream et rapporte-vous?



5
votes

Décorez le flux d'entrée avec un gzipinputtream . xxx


0 commentaires

2
votes

Le code suivant devrait fonctionner. Gardez à l'esprit que vous devrez manipuler des exceptions correctement.

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 commentaires