web-dev-qa-db-fra.com

Fermeture de flux dans Java

Pourquoi devons-nous fermer un FileInputStream (et les flux en général) dans tous les cas avant de quitter le programme? Que se passerait-il autrement? Si le programme s'arrête avant que le flux d'entrée ne soit fermé explicitement dans le programme, le flux ne se ferme-t-il pas également automatiquement?

51
user42155

Les descripteurs de fichiers sont des ressources limitées et limitées. Vous pouvez en manquer si vous ne les nettoyez pas correctement, tout comme les connexions à la base de données.

Si vous avez écrit un petit programme avec un seul utilisateur, vous pouvez vous en sortir en étant bâclé et en ne fermant pas dans un bloc enfin.

Mais si vous finissez par utiliser cet idiome dans une application qui a de nombreux utilisateurs et descripteurs de fichiers, vous pourriez avoir un problème.

"D'abord, nous prenons nos habitudes, puis ils nous font." J'essaie d'appliquer les meilleures pratiques même si elles ne sont pas nécessaires.

45
duffymo

Oui, à la fin du processus, les ressources non gérées seront libérées. Pour InputStreams, c'est très bien. Pour OutputStreams, vous pourriez perdre des données en mémoire tampon, vous devriez donc au moins vider le flux avant de quitter le programme.

36
Jon Skeet

Mec. Si vous ne fermez pas votre flux, votre test unitaire échouera. Ou du moins, ça devrait. C'est pourquoi vous devez le fermer. ;)

Et tandis que le système d'exploitation sera presque certainement nettoyé si vous venez de quitter, ils seront généralement libérés plus rapidement si vous les fermez explicitement. De plus, que se passe-t-il si votre code se retrouve dans un programme de longue durée à un moment donné? Ensuite, ils auront des problèmes et vous maudiront. :(

C'est comme se laver les mains après être allé aux toilettes. Finalement, quelqu'un paiera le prix si vous ne le faites pas. Vous pouvez vous en tirer un moment, mais c'est toujours une bonne pratique.

25
Don Branson

En plus de la réponse de Jon, c'est généralement une bonne idée de fermer n'importe quelle ressource.

Pensez à une connexion à une base de données. Votre base de données ne peut pas avoir des connexions infinies ouvertes, dans ce cas, lorsque vous n'en avez pas besoin, il est préférable de la fermer dès que vous en avez terminé.

Il est également bon d'en faire une habitude. "enfin" le bloc est votre ami. En cas de C++, vous pouvez également utiliser RAII pour gérer cela automatiquement .

10
Srikanth

Sorte de. Le flux est soutenu par un "vrai" descripteur de fichiers du système d'exploitation, et lorsque le processus se termine, le système d'exploitation nettoiera tous les descripteurs de fichiers ouverts.

Quoi qu'il en soit, il est recommandé de toujours fermer vos ressources lorsque vous avez terminé, alors fermez les flux :)

7
Joao da Silva

Si vous ne fermez pas les flux, vous risquez de rencontrer des problèmes pour les rouvrir. Cela est particulièrement vrai s'ils sont suspendus à l'extrémité des prises.

La fermeture d'un flux garantit également que les données sont vidées dans le flux s'il reste des données à envoyer.

6
Philip Reynolds