Dois-je fermer InputStream après avoir fermé le lecteur?

Je me demandais si je devais fermer le InputStream après avoir fermé le lecteur?

try { inputStream = new java.io.FileInputStream(file); reader = new InputStreamReader(inputStream, Charset.forName("UTF-8")); } catch (Exception exp) { log.error(null, exp); } finally { if (false == close(reader)) { return null; } // Do I need to close inputStream as well? if (false == close(inputStream)) { return null; } } 

Non, vous n’êtes pas obligé

Étant donné que l’approche par décorateur utilisée pour les stream en Java peut générer de nouveaux stream ou lecteurs en les attachant à d’autres, cela sera automatiquement géré par l’implémentation de InputStreamReader .

Si vous regardez sa source InputStreamReader.java vous voyez que:

 private final StreamDecoder sd; public InputStreamReader(InputStream in) { ... sd = StreamDecoder.forInputStreamReader(in, this, (Ssortingng)null); ... } public void close() throws IOException { sd.close(); } 

L’opération de fermeture ferme donc le InputStream sous-jacent au lecteur de stream.

EDIT: Je veux être sûr que StreamDecoder ferme également les travaux sur le stream d’entrée, restz à l’écoute.

Vérifié, dans StreamDecoder.java

 void implClose() throws IOException { if (ch != null) ch.close(); else in.close(); } 

qui est appelée lorsque la fermeture de sd est appelée.

Techniquement, la fermeture du Reader ferme le InputStream . Toutefois, en cas d’échec entre l’ouverture du InputStream et la création du Reader , vous devez toujours fermer le InputStream . Si vous fermez le InputStream [la ressource], il ne devrait pas y avoir de bonne raison de fermer le Reader [le décorateur]. Il y a aussi des bugs populaires où la fermeture d’un décorateur peut provoquer une exception avant de fermer le décoré. Alors:

 Resource resource = acquire(); try { Decorator decorated = decorate(resource); use(decorated); } finally { resource.release(); } 

Il y a des complications à surveiller. Certains décorateurs peuvent en fait contenir des ressources natives en raison de leur implémentation. Les décorateurs de sortie devront généralement être vidés, mais uniquement dans le cas heureux (donc dans le bloc try not the finally ).

Vous n’avez pas besoin de fermer le stream, si vous close() le lecteur.

Ferme le stream et libère toutes les ressources système associées. Une fois le stream fermé, les invocations supplémentaires read (), ready (), mark (), reset () ou skip () lancent une exception IOException. La fermeture d’un stream précédemment fermé n’a aucun effet.

Non, le lecteur ne fermera pas le InputStream sous-jacent

Selon la source qui renifle le lecteur ferme son stream d’entrée sous-jacent. Selon javadoc, il semble que InputStreamReader “ferme le stream” lorsque vous appelez reader.close ().

Je ne sais pas si ANY Reader doit fermer ses sources lorsque vous faites read.close (). Je pense que c’est important pour que votre code puisse utiliser un lecteur, quel que soit le type de béton.

Quoi qu’il en soit, il est logique que cela soit appliqué.