Est-il sécuritaire d'utiliser Apache commons-io IOUtils.closeQuietly?
Est ce code
BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt"));
try {
bw.write("test");
} finally {
IOUtils.closeQuietly(bw);
}
sûr ou pas? Comme je le comprends quand on ferme un BufferedWriter il sera effacé de sa mémoire tampon du flux sous-jacent et peut échouer en raison d'une erreur. Mais IOUtils.closeQuietly API dit que toutes les exceptions seront ignorés.
Est-il possible à une perte de données passent inaperçues en raison de IOUtils.closeQuietly?
- Pas une réponse, mais try-with-resources instruction permettra d'éliminer la plupart des besoins pour l'utilisation de
IOUtils.closeQuietly
. - Bonne réponse, mais cette fonctionnalité est nouvelle dans Java 7. Si vous êtes coincé à l'aide de Java 6 pour une raison quelconque (par exemple, les anciennes versions d'Android) puis
closeQuietly()
est encore le chemin à parcourir. - IOUtils.closeQuietly A ÉTÉ abandonnée MAINTENANT essai d'utilisation de la ressource à la place.
Vous devez vous connecter pour publier un commentaire.
Le code devrait ressembler à ce sujet à la javadoc de
closeQuietly()
:closeQuietly()
n'est pas prévu pour un usage général au lieu d'appelerclose()
directement sur un Refermable. Son intention de cas d'utilisation est de veiller à l'étroit à l'intérieur d'un enfin-bloc - toute erreur de manipulation, vous devez avoir à faire AVANT que.Cela signifie que, si vous voulez réagir sur les Exceptions lors de l'appel de
close()
ouflush()
ensuite, vous avez à gérer de la manière normale. L'ajout decloseQuietly()
dans votre enfin-bloc s'assure juste la fermer, par exemple, lorsque la chasse d'échec et de proximité n'a pas été appelé dans essayez-bloc.close()
là. Mais quand vous ne se soucient que des exceptions lors du flush, mais pas près alors vous devez rincer ici explicitement. Juste écrit à la fois des appels de méthode pour faire de l'exemple un peu plus universel.bw.close()
et bw sera toujours fermée correctement dans le finally{} clause. Cette façon de faire vous permet aussi d'apprendre des erreurs au cours debw.close()
close()
n'est pas toujours appelflush()
et parfoisclose()
appels de chasse d'eau, mais avec leIOException
masqué en elle. VoirFilterOutputStream
par exemple.C'est sûr, tant que votre demande ne se soucie pas de savoir si l'écriture a réussi sans erreur. Si votre application a besoin pour gérer les erreurs d'écriture, il n'est pas sûr que les données mises en tampon vidé sur fermer peut être perdu et l'erreur d'ingestion.
Il est possible en théorie, mais je ne peux pas dire que j'ai jamais vu de près() échoue. Généralement échouer rapidement signifie que l'une des précédentes opérations d'e /s comme l'ouverture du fichier échoue en premier. Vous pouvez écrire un proche qui ne l'ignore pas, IOExceptions mais cela pourrait neutraliser la véritable cause d'une exception si c'est quelque chose dans le bloc try/catch qui a échoué.
Ce que vous voulez, c'est quelque chose comme ce qui suit (ce qui est exagéré dans la plupart des cas)
IOUtils.closeQuietly()
n'est pas prévu pour un usage général au lieu d'appeler close() directement sur un Refermable. Son utilisation prévue cas est de s'assurer que close() est appelée à l'intérieur d'un bloc finally pour éviter la fuite des ressources - gestion des erreurs toutes les (enregistrement, à l'exception d'emballage et de renvoi) doit être fait AVANT que voir de Fabian répondrecloseQuietly()
est un peu plus qu'un appel àclose()
entouré par un try/catch qui ne tient pas compte des exceptions. La documentation est d'accord. Vous peut l'utilisationcloseQuietly()
en place de close(), et lafinally{ }
bloc est l'endroit idéal pour ce faire.Oui, c'est sûr à utiliser, mais seulement pour Java6 et inférieur. De Java7, vous devriez utilisateur essayez-avec-des ressources.
Il permettra d'éliminer une grande partie de la code standard, que vous avez et la nécessité d'utiliser
IOUtils.closeQuietly
.Maintenant, vous exemple:
Peut être écrite comme:
Il est important de noter que pour utiliser le try-with-ressource, votre ressource nécessité de mettre en œuvre une nouvelle interface appelée java.lang.AutoCloseable qui a été introduit dans Java 7.
Aussi, vous pouvez inclure un certain nombre de ressources dans un try-with-ressource bloc, juste les séparer avec
;