Le moyen privilégié pour l'utilisation de Java ZipOutputStream et BufferedOutputStream
En Java importe-t-il si j'instancie un ZipOutputStream premier, ou le BufferedOutputStream en premier? Exemple:
FileOutputStream dest = new FileOutputStream(file);
ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(dest));
//use zip output stream to write to
Ou:
FileOutputStream dest = new FileOutputStream(file);
BufferedOutputStream out = new BufferedOutputStream(new ZipOutputStream(dest));
//use buffered stream to write to
Dans mon non-scientifique timings je n'arrive pas à dire beaucoup de choses ici. Je ne peux pas voir quoi que ce soit dans l'API Java qui dit que si l'un de ces moyens est nécessaire ou préférable. Tous les conseils? Il semble que la compression de la sortie de la première puis de mise en mémoire tampon pour l'écrit serait plus efficace.
- Théoriquement, la compression puis de mise en mémoire tampon va être plus rapide. Cependant,
GZipOutputStream
a une mémoire tampon interne, afin de ne pas écrire des octets pour le flux sous-jacent. En fonction du type de flux (par exemple, fichier vs socket) et par la taille des tampons, vous peut ou peut ne pas voir la différence.
Vous devez vous connecter pour publier un commentaire.
Vous devez toujours placer l'
BufferedOutputStream
avec leZipOutputStream
, jamais l'inverse. Voir le code ci-dessous:Que les commentaires qui disent que le
putNextEntry()
etcloseEntry()
méthodes ne sont pas disponibles sur leBufferedOutputStream
. Sans l'appel de ces méthodesZipOutputStream
déclenche une exceptionjava.util.zip.ZipException: no current ZIP entry
.Par souci d'exhaustivité, il est intéressant de noter que la clause finally seuls les appels
close()
sur leZipOutputStream
. C'est parce que, par convention, le tout intégré dans Java flux de sortie wrapper implémentations de propager la clôture.MODIFIER
Je l'ai juste testé l'autre manière autour. Il s'avère que l'enveloppant d'un
ZipOutputStream
avecBufferedOutputStream
et ensuite seulement l'appelwrite()
sur elle (sans créer /écritures de clôture) ne sera pas jeter unZipException
. Au lieu de cela, le résultant ZIP fichier sera corrompu, sans toutes les entrées à l'intérieur.ZipOutputStream
est le plus performant pour vous, vous devez vous figure out vous-même,Vous devez:
parce que vous voulez mettre en mémoire tampon de l'écriture sur le disque (parce que c'est beaucoup plus efficace dans de grands blocs de données que dans beaucoup de petits).
Ce
serait tampon avant la compression zip. Mais tout cela se fait dans la mémoire et n'a pas besoin de mise en mémoire tampon parce que beaucoup de peu d'accès à la mémoire sont à environ la même vitesse qu'un peu plus grands.
Dans la mémoire générale, le temps est proportionnel au nombre d'octets de lecture/écriture.
Comme mentionné dans les commentaires:
Les méthodes de
ZipOutputStream
qui ne font pas partie deBufferedOutputStream
ne serait pas disponible aussi. E. g.putNextEntry
etcloseEntry
.ZipOutputStream
dans unBufferedOutputStream
est dénué de sens, tout à fait, comme elle n'expose pas leputNextEntry
etcloseEntry
méthodes.