Je suis un peu confus. Je sais qu'un zip vide n'est pas légal. Mais qu'en est-il de cet exemple d'échantillon: si aucune entrée zip n'avait été ajoutée pour une raison quelconque (situation éventuellement exceptionnelle), l'exception suivante sera levée sur une tentative de fermeture: p> Exception in thread "main" java.util.zip.ZipException: ZIP file must have at least one entry
at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:304)
at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:146)
at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:321)
4 Réponses :
Vous devez suivre si vous avez ajouté que vous avez ajouté le flux zip et fermez-le uniquement lorsque les choses ont été ajoutées: de si vous n'avez pas besoin du compte, utilisez simplement un booléen < / code> drapeau. p> p>
Le fichier zip reste ouvert et verrouillé de cette façon ... Comment le fermer?
@Lucho a ajouté du code pour fermer le fichier lorsque le flux zip est vide. regarde.
Vous devez fermer le le < Code> IOUTILS CODE> La classe est trouvée dans Jakarta Commons IO . En utilisant cela signifie que vous n'avez pas à traiter avec le possible FileOutPutStream code>, pas le
zipOutputStream code>, car le premier est ce qui consomme des ressources système.
ioexception code> qui peut être lancé par
fermer () code>. P> p>
Merci pour votre aide, cela devrait être la vérité :-)
Cette solution va bien, mais le raisonnement est incorrect: vous pouvez fermer soit le flux. La fermeture d'un flux d'emballage comme ZipOutPutStream fermera également la filet de bilan de niveau inférieur.
Notez que Java 7 a introduit un Essayez avec la ressource Block qui rend ce genre de code beaucoup plus propre !!
Au lieu de fermer le flux uniquement lorsque des choses sont ajoutées, ce que j'ai fait est une vérification de la condition pour voir s'il y avait quelque chose à zip, avant d'exécuter le code postal. Cela m'a aidé à simplifier le processus et je pense que peut être utilisé en général pour gérer le "fichier zip doit avoir au moins un problème d'entrée". Vrai que la fermeture Je pense que c'est un problème avec Java, qui ne gère pas le cas lorsqu'il n'y a pas de fichier à zip. P > IE: P> zos code> peut jeter d'autres exceptions, mais c'est rare.
int itemsToAdd=0;
//....
if ( itemsToAdd > 0 ) {
ZipOutputStream zos = new ZipOutputStream(file);
try {
//add files to zip
}
finally {
zos.close();
}
}
Si vous utilisez Java 7 ou plus, vous pouvez utiliser des ressources traitantes pour une meilleure lisibilité
par exemple: p>