Remarque : Cette question et la plupart de ses réponses datent d'avant la sortie de Java 7. Java 7 fournit Gestion automatique des ressources fonctionnalité pour faire cela facilement. Si vous utilisez Java 7 ou une version ultérieure, vous devriez passer à la réponse de Ross Johnson .
Quelle est la meilleure façon, la plus complète, de fermer des flux imbriqués en Java ? Prenons l'exemple suivant :
FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
Je comprends que l'opération de clôture doit être assurée (probablement en utilisant une clause finally). Ce que je me demande, c'est s'il est nécessaire de s'assurer explicitement que les flux imbriqués sont fermés, ou s'il suffit de s'assurer de fermer le flux extérieur (oos) ?
Une chose que j'ai remarquée, du moins en ce qui concerne cet exemple spécifique, c'est que les flux internes ne semblent lancer que des exceptions de type FileNotFound. Ce qui semble impliquer qu'il n'y a pas techniquement besoin de s'inquiéter de les fermer s'ils échouent.
Voici ce qu'a écrit un collègue :
Techniquement, s'il était mis en œuvre correctement, le fait de fermer le (oos) devrait suffire. Mais l'implémentation semble défectueuse.
Exemple : BufferedOutputStream hérite de close() de FilterOutputStream, qui la définit comme suit :
155 public void close() throws IOException {
156 try {
157 flush();
158 } catch (IOException ignored) {
159 }
160 out.close();
161 }
Cependant, si flush() lève une exception d'exécution pour une raison quelconque, alors out.close() ne sera jamais appelée. Il semble donc plus "sûr" (mais moche) de se préoccuper principalement de la fermeture de FOS, qui consiste à garder le fichier ouvert.
Quelle est la meilleure approche pour fermer les flux imbriqués lorsque l'on a absolument besoin d'être sûr de soi ?
Existe-t-il des documents officiels Java/Sun qui traitent de ce sujet en détail ?