55 votes

Dois-je fermer un ByteArrayInputStream ?

Question brève,

J'ai vu dans un vieux code qu'un ByteArrayInputStream a été créé comme :

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

Ensuite, le BufferedReader est utilisé pour lire somebytes ligne par ligne.
Tout fonctionne bien, mais j'ai remarqué que le BufferedReader n'est jamais fermée.
Tout cela fonctionne dans une application websphere de longue date, la somebytes ne sont pas très grands (200k au maximum), il n'est invoqué que quelques fois par semaine et nous ne connaissons pas de fuites de mémoire apparentes. Je m'attends donc à ce que tous les objets soient collectés avec succès.

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

Avec mes salutations les plus cordiales Jeroen.

57voto

Tomasz Nurkiewicz Points 140462

Vous ne devez pas fermer ByteArrayInputStream dès qu'il n'est plus référencé par une variable, le ramasse-miettes libère le flux et l'on passe à l'étape suivante. somebytes (en supposant bien sûr 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 qu'au lieu d'octets bruts vous lirez un fichier ? Les outils d'analyse statique du code comme PMD ou FindBugs (voir commentaires) se plaindra très probablement.

Si vous en avez assez de fermer le flux et d'être contraint de gérer des IOException vous pouvez utiliser IOUtils :

IOUtils.closeQuietly(stream);

13voto

jzd Points 17369

Il est toujours bon de fermer ses lecteurs. Cependant, le fait de ne pas fermer un ByteArrayInputStream n'a pas un effet négatif potentiel aussi important, car vous n'accédez pas à un fichier, mais simplement à un tableau d'octets en mémoire.

3voto

Kuldeep Sharma Points 11

Comme l'a mentionné @TomaszNurkiewicz, il est toujours bon de fermer le flux ouvert. Une autre bonne façon de le laisser faire le bloc try lui-même. Utiliser try avec une ressource comme .......

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

Ici, Workbook et InputStream implémentent tous deux l'interface Closeable. Ainsi, une fois que le bloc try se termine (normalement ou brusquement), le flux sera fermé à coup sûr.

1voto

Les ressources doivent être fermées dans un finally (ou équivalent). Mais si vous n'avez que quelques octets, cela n'a pas d'importance. Toutefois, lorsque vous écrivez, veillez à flush dans le cas heureux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X