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.
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);
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.
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.
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.