web-dev-qa-db-fra.com

Dois-je fermer un ByteArrayInputStream?

Question courte,

J'ai vu dans un ancien code où un ByteArrayInputStream a été créé comme:

new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));

Et puis le BufferedReader est utilisé pour lire somebytes ligne par ligne.
Tout fonctionne bien, mais j'ai remarqué que le BufferedReader n'est jamais fermé.
Tout cela fonctionne dans une application Websphere de longue durée, les somebytes ne sont pas terriblement gros (200k maximum), ils ne sont invoqués que quelques fois par semaine et nous n'avons pas de mémoire apparente fuit. Je m'attends donc à ce que tous les objets soient correctement récupérés.

J'ai toujours (une fois) appris que les flux d'entrée/sortie doivent être fermés, dans une instruction finally. ByteStreams est-il l'exception à cette règle?

cordialement Jeroen.

42
dr jerry

Vous n'avez pas à fermer ByteArrayInputStream, au moment où il n'est référencé par aucune variable, le garbage collector libérera le flux et somebytes (bien sûr en supposant qu'ils ne soient pas référencés ailleurs).

Cependant c'est toujours une bonne pratique de fermer chaque flux, en fait, peut-être que l'implémentation créant le flux changera à l'avenir et au lieu d'octets bruts vous vais lire le fichier? Également des outils d'analyse de code statique comme PMD ou FindBugs (voir commentaires) se plaindra très probablement.

Si vous vous ennuyez de fermer le flux et d'être obligé de gérer impossible IOException, vous pouvez utiliser IOUtils :

IOUtils.closeQuietly(stream);
44
Tomasz Nurkiewicz

Il est toujours recommandé de fermer vos lecteurs. Cependant, ne pas fermer un ByteArrayInputStream n'a pas autant d'effets négatifs potentiels car vous n'accédez pas à un fichier, juste à un tableau d'octets en mémoire.

7
jzd

Comme @TomaszNurkiewicz l'a mentionné, il est toujours bon de fermer le flux ouvert. Un autre bon moyen de le laisser faire le bloc d'essai lui-même. Utilisez try avec une ressource comme .......

try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 

ici, Workbook et InputStream implémentent tous deux une interface fermable, donc une fois que le bloc d'essai est terminé (normalement ou brusquement), le flux sera fermé à coup sûr.

2
KulDeep

Les ressources doivent être fermées dans un finally (ou équivalent). Mais là où vous n'avez que quelques octets, cela n'a pas d'importance. Bien que lors de l'écriture, faites attention à flush dans le cas heureux.

1
Tom Hawtin - tackline