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
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();
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;
- 1. Java BlockingQueue de taille = 1?
- 2. comment changer OutPut Taille de la broche et ColorSpace/Compression dans DirectShow
- 3. Quelles techniques les bibliothèques de compression JavaScript utilisent-elles pour réduire la taille du fichier?
- 4. Java Swing Table taille
- 5. augmenter la taille de segment de Java en permanence?
- 6. Comment automatiser la compression de fichiers JavaScript avec YUI Compressor?
- 7. La compression TIFF Groupe 5
- 8. Définition de la compression gzip dans asp.net
- 9. Bibliothèques de compression LZH
- 10. Exception de compression Gzip en symbian C++
- 11. Où puis-je en savoir plus sur la compression de texte en Java?
- 12. compression PNG avec PHP magickwand
- 13. Java URLConnection: comment connaître la taille d'un fichier web?
- 14. maven yui compression sur la guerre: guerre
- 15. Comment implémenter la compression GZip dans ASP.NET?
- 16. Déconnecter la connexion URL en fonction de la taille ou de la durée du fichier - Java
- 17. Bibliothèques de compression pour Ruby?
- 18. Ressources recommandées pour la recherche de compression de données
- 19. Taille du disque en Java 5
- 20. La fonction gzuncompress de PHP en Java?
- 21. La méthode la plus rapide pour gérer la compression UIImagePickerController
- 22. Compression TDD et JPEG
- 23. Méthode Java avec paramètres de taille de tableau appliqués?
- 24. Java NIO: lecture de blocs de taille variable
- 25. compression GZIP en PHP
- 26. Comment désactiver la compression de jar dans Maven
- 27. Comment Quartz gère-t-il la compression de texture?
- 28. "Carriage Return" est supprimé lors de la compression du fichier
- 29. compromis de différents algorithmes de compression
- 30. Tutoriels vidéo de compression de données?
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)' –
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
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é. :-) –