Pourquoi est-InputStream.close() déclarée à jeter IOException?
La java.io.InputStream.close()
méthode est déclarée à jeter un IOException
. Dans quelles circonstances une telle exception en fait être jetés?
Edit: Oui j'ai lu la javadoc. Quelqu'un peut-il être plus précis que "lorsqu'une erreur d'e/S se produit"? Ce I/O erreur peut se produire lors de la fermeture d'une InputStream
?
- si une erreur d'e/S se produit.
- Peut-être que si il est déjà fermé?
- Je pense que vous trouverez votre réponse à "Ce que l'I/O erreur peut se produire..." question à la classe IOException pas dans la classe InputStream javadoc. Comme mentionné dans ma réponse j'ai trop attendu pour être en InputStream, ne pouvait pas trouver il et eu mes "Ahha" moment lorsque l'on regarde tous les sous-classes de IOException.
- La JavaDoc de
java.io.Closable.close
écrit: Si le flux est déjà fermé, puis d'invoquer cette méthode n'a aucun effet.
Vous devez vous connecter pour publier un commentaire.
Dans le cas de flux d'entrée par la lecture d'un fichier système, une erreur peut être déclenchée alors que le système de fichiers lui-même les mises à jour de la heure du dernier accès métadonnées, ou certains autres métadonnées, sur un fichier lors de la fermeture. De toute façon, cela arrive presque jamais dans la pratique.
Dans le cas d'un flux d'entrée de la lecture à partir d'un réseau de connexion, une erreur sur la fermeture est un peu plus concevable. Normale fermeture d'une prise réseau implique, en réalité, une demande de fermeture (TCP/IP paquet FIN) d'être envoyé sur la connexion et attendre la fin à accepter cette demande de fermeture. (En fait, à l'autre extrémité de la connexion, puis à son tour envoie une demande de fermeture, dont la fin reconnaît.) Ainsi, dans le cas d'une prise de flux d'entrée, une clôture de l'opération implique l'envoi de trafic sur la connexion et la fermeture peut donc échouer avec une erreur.
Noter que dans de nombreuses implémentations,
close()
ne pas jeter unIOException
si le flux est déjà fermé; il a simplement échoue silencieusement pour fermer le flux de données.Je suis à la recherche à travers le code source Java, et ont trouvé quelque chose d'intéressant qui est indicatif de la
IOException
raison.InputStream
est une classe abstraite. Par conséquent, nous ne pouvons pas prédire le type d'entrée qui sera fermé, donc il est bon de garder la circulation de l'information.Quel que soit le code utilise que les flux d'entrée doit être en mesure de jeter un
IOException
, car il ya une chance que la fermeture du flux d'entrée peut échouer. Si elle échoue, ce qui est à l'aide de la mise en œuvre doit être le savoir, car il ya une bonne chance il doit être manipulé.Il est important de comprendre la mise en page de l'Exception de la structure en Java. Chaque exception, bien sûr, s'étend
Exception
. Cependant, il y a aussi des catégories plus larges d'exceptions:java.lang.IOException
est l'un de ces, et couvre toutes les entrée/sortie des exceptions. Lorsque nous disons qu'il y a eu une erreur d'e/S, nous utilisons tout ce qui tombe sousIOException
. En conséquence, de nombreuses exceptions s'étend celui-ci, par exempleFileNotFoundException
,EOFException
, etc. comme il est important d'avoir une large, globale exception pour gérer ces.En conséquence, toute IO classe devra être en mesure de jeter tout des différents IOExceptions sur fermer.
close()
doit donc jeterIOException
- ce qui donne à sa mise en œuvre, la possibilité de projeter les extensions deIOException
ainsi. C'est pourquoiclose()
jetteIOException
- les exceptions sont héritées, et vous devez être en mesure de tout de la IOExceptions lors de la fermeture d'un ruisseau.Voici quelques scénarios noter:
close()
est en fait essentiel pour le système d'exploitation, comme il a besoin d'avoir un indicateur du moment où le fichier n'est plus occupé)IOException
(par exempleFileNotFoundException
)Vous pouvez vérifier ce qui a causé un
IOException
en exécutantException.getMessage()
.java.io.Closable.close
. Comme pour les autres causes, je vois comment ils peuvent se produire lors de l'ouverture ou de la lecture à partir d'un flux, mais lors de la fermeture?InputStream
- rappelez-vous, InputStream est résumé. Nous ne pouvons pas prédire le type d'entrée qui sera fermé, donc il est bon de garder la circulation de l'information. Je serait furieux si j'avais besoin de gérer cette erreur, mais ne le pouvait pas, parce qu'il y avait une liste non-substituables mise en œuvre. C'est pourquoi nous lancer des exceptions, en premier lieu: de sorte que le reste du code est capable de les traiter, ou pas. En outre, de libérer le descripteur de fichier peut échouer si le disque n'est pas accessible à l'heure de la fermeture.close()
opération.Sous-jacents à proximité de l'appel système devront être réalisés par la suite, par exemple, sur linux http://linux.die.net/man/2/close. Cet appel est documenté à l'échec avec
EIO
: "Une erreur d'e/S s'est produite." Donc, la raison en est, que le sous-jacent du système de fichiersclose
appel peut échouer.J'ai demandé au sujet de moi-même et ai fait un peu de recherche sur ce sujet il ya quelques années. C'est ce que je sais....
Si vous regardez la javadoc dans le lien que vous avez fourni, il indique clairement que "La méthode close de InputStream ne fait rien", donc il n'y a pas moyen qu'il allait lancer une exception, correct? Mais alors, en regardant toutes les sous-classes de IOException vous verrez qu'il existe de nombreuses situations où les sous-classes de inputstream peut ne pas être en mesure de fermer le flux de données. Donc, ma meilleure supposition est que cette exception est conçu pour les sous-classes d'en faire usage.
http://docs.oracle.com/javase/6/docs/api/java/io/IOException.html
Dans certains cas, il n'est rien de plus qu'une nuisance, et dans d'autres, elle indique clairement que quelque chose n'allait pas. Tout dépend de quel type de inputstream mise en œuvre vous faites usage de.