2009-07-30 7 views
5

Lors de l'utilisation de la méthode deflate de java.util.zip.Deflater, un octet [] doit être fourni en tant qu'argument, à quelle taille devrait être initialisé ce byte []? J'ai lu il n'y a aucune garantie que les données compressées seront même plus petites que les données non compressées. Y a-t-il un certain pourcentage de l'apport que je devrais faire? Actuellement, je le fais deux fois plus grand que l'entréeJava - taille de la compression output-byteArray

Répondre

8

Après avoir appelé deflate, appelez le finished pour voir s'il a encore plus à produire. par exemple:

byte[] buffer = new byte[BUFFER_SIZE]; 
while (!deflater.finished()) { 
    int n = deflater.deflate(buffer); 
    // deal with the n bytes in out here 
} 

Si vous voulez juste pour recueillir tous les octets en mémoire que vous pouvez utiliser un ByteArrayOutputStream. par exemple:

byte[] buffer = new byte[BUFFER_SIZE]; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
while (!deflater.finished()) { 
    int n = deflater.deflate(buffer); 
    baos.write(buffer, 0, n); 
} 
return baos.toByteArray(); 
+2

Et si vous voulez finir avec un tableau d'octets géant, créez un 'ByteArrayOutputStream' en dehors de la boucle, puis d'y ajouter du chaque itération à travers avec 'bos.append (out, 0, n)' –

+7

Merci pour la réponse. Je ne comprends pas bien ... Dois-je continuer à appeler deflate() plusieurs fois jusqu'à ce que l'ensemble de l'entrée ait été compressé? Et à quoi dois-je définir le paramètre BUFFER_SIZE? Y at-il un tutoriel ou quelque chose comme ça quelque part qui explique cela? merci – Clox

+1

Je suppose qu'il y avait une sorte de condition de course, parce que c'est exactement ce que fait le deuxième exemple d'exemple que j'ai posté. :-) –

6

Pourquoi Java classe-t-il la classe "deflater"? Le mot est "déflateur". Jeez! Désolé, je devais enlever ça de ma poitrine. Comme indiqué, l'utilisation prévue est de continuer à appeler deflate jusqu'à ce que vous obteniez toute la sortie de la compression. Cependant, si vous voulez vraiment le faire en un seul appel, alors il y a une limite sur le montant par lequel deflate peut étendre les données. Il y a une fonction dans zlib que Java ne rend malheureusement pas disponible et qui s'appelle deflateBound() qui fournit cette limite supérieure. Vous pouvez simplement utiliser le conservateur lié de cette fonction, avec la ligne correspondante copié ici:

complen = sourceLen + 
      ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; 
Questions connexes