2010-05-04 7 views

Répondre

7

De l'API docs on ZipFile.close():

Fermer ce fichier ZIP fermera tous les flux d'entrée renvoyés par précédemment appels de la méthode getInputStream.

Et InputStream.close() jette un IOException, alors ZipFile.close() doit le jeter aussi. Selon le API docs for InputStream.close(), il lance un IOException "si une erreur d'E/S se produit". Ce n'est pas très descriptif, mais c'est un large filet. InputStreams peut représenter des flux provenant du système de fichiers, du réseau, de la mémoire, etc. InputStreams peut impliquer des tampons devant être vidés, des sockets devant être fermés, des ressources à libérer, des verrous devant être libérés, etc. arriver pour une variété de raisons.

+0

Si l'exception est levée sur un appel read() ou write(), je peux comprendre que la lecture ou l'écriture a échoué. Mais si l'exception est lancée sur close(), qu'est-ce qui a échoué? –

1

De l'homme à proximité (2):

Ne pas vérifier la valeur de retour de close() est une erreur de programmation courante mais grave. Il est tout à fait possible que les erreurs sur une opération d'écriture précédente (2) soient d'abord signalées à la fermeture finale(). Ne pas vérifier la valeur de retour lors de la fermeture du fichier peut entraîner une perte de données silencieuse. Cela peut notamment être observé avec NFS et avec quota de disque.

+2

Alors que la fermeture d'un flux en lecture seule ne peut pas être lancée, l'infrastructure d'E/S de java ne peut pas vérifier cela car elle n'a pas de flux de lecture et d'écriture vérifiés statiquement. – Joshua

0

Je ne suis pas sûr, mais je pense que IOException est levée lorsque l'un des événements suivants se produisent:

  • Le fichier zip a été supprimé par quelque chose/quelqu'un en dehors de l'application.
  • Lorsque le lecteur qui contient le fichier zip est démonté/déconnecté

Beaucoup d'autres événements pourraient être la raison, mais ce sont les deux seuls que je pouvais penser en ce moment.

+0

Mais pourquoi l'une de ces conditions entraînerait-elle une erreur lors de la fermeture d'un fichier ZipFile en lecture seule? – EJP

+0

Je n'ai pas mentionné que ce sont les seules conditions pour lancer l'exception. –

0

La documentation ZipFile.close() dit:

Fermer ce fichier ZIP fermera tous les flux d'entrée précédemment retournée par la méthode de invocations getInputStream.

La méthode natif close effectue vraisemblablement la fermeture des InputStreams. La méthode close de InputStream a IOException comme exception vérifiée.

La cause la plus probable est une condition d'espace sur le système de fichiers où le fichier zip est en cours d'écriture erreur dans le système de fichiers sous-jacent. À moins que vous puissiez identifier la cause et contourner le problème à la volée, tout ce que vous pouvez faire est de signaler la condition à l'utilisateur.

+0

Lorsque vous utilisez un 'InputStream', vous lisez *, pas * écrivez *, donc le manque d'espace disque dû à l'écriture d'un fichier zip ne peut pas être la cause d'une' IOException' dans les circonstances de cette discussion . – Asaph

+0

Merci, corrigé. –

Questions connexes