11
votes

Fermeture de zipoutputtream

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: xxx pré>

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)


0 commentaires

4 Réponses :


4
votes

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: xxx

de si vous n'avez pas besoin du compte, utilisez simplement un booléen < / code> drapeau.


2 commentaires

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.



8
votes

Vous devez fermer le FileOutPutStream , pas le zipOutputStream , car le premier est ce qui consomme des ressources système. xxx

le < Code> IOUTILS La classe est trouvée dans Jakarta Commons IO . En utilisant cela signifie que vous n'avez pas à traiter avec le possible ioexception qui peut être lancé par fermer () .


3 commentaires

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 !!



4
votes

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 zos code> peut jeter d'autres exceptions, mais c'est rare.

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>

int itemsToAdd=0;
//....

if ( itemsToAdd > 0 ) {

    ZipOutputStream zos = new ZipOutputStream(file);
    try {
        //add files to zip
    }
    finally {
        zos.close();
    }
}


0 commentaires

0
votes

Si vous utilisez Java 7 ou plus, vous pouvez utiliser des ressources traitantes pour une meilleure lisibilité

par exemple: xxx


0 commentaires