Dans quelles circonstances java.util.zip.ZipFile.close() lancer une IOException? Sa signature de méthode indique qu'elle peut être lancée, mais il ne semble pas y avoir d'endroit où cela pourrait se produire à partir du code source, sauf s'il s'agit d'un code natif. Quelles mesures correctives, le cas échéant, pourraient être prises au moment où cette exception est détectée?quand est-ce que java.util.zip.ZipFile.close() lance IOException?
Répondre
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.
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.
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
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.
Mais pourquoi l'une de ces conditions entraînerait-elle une erreur lors de la fermeture d'un fichier ZipFile en lecture seule? – EJP
Je n'ai pas mentionné que ce sont les seules conditions pour lancer l'exception. –
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.
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
Merci, corrigé. –
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é? –