web-dev-qa-db-fra.com

Utilisation de flush () avant close ()

Selon les documents Java, invoquer close () sur n'importe quel flux Java.io appelle automatiquement flush (). Mais j'ai vu dans de nombreux exemples, même dans les codes de production, les développeurs ont explicitement utilisé flush () juste avant close (). Dans quelles conditions devons-nous utiliser flush () juste avant close ()?

Le développeur prend l'habitude d'appeler flush () après avoir écrit quelque chose qui doit être envoyé.

IMHO L'utilisation de flush () puis close () est courante quand il y a juste eu une écriture, par ex.

// write a message
out.write(buffer, 0, size);
out.flush();

// finished
out.close();

Comme vous pouvez le voir, flush () est redondant, mais signifie que vous suivez un modèle.

28
Peter Lawrey

Je suppose que dans de nombreux cas, c'est parce qu'ils ne savent pas que close() invoque également flush(), donc ils veulent être en sécurité.

Quoi qu'il en soit, l'utilisation d'un flux tamponné devrait rendre le rinçage manuel presque redondant.

30
Bozho

Je tiens à souligner un concept important auquel de nombreux commentaires précédents ont fait allusion:

La méthode close() d'un flux ne PAS nécessairement appelle flush().

Par exemple org.Apache.axis.utils.ByteArray # close () n'invoque pas flush().
(cliquez sur le lien pour voir le code source)

Il en va de même plus généralement pour toutes les implémentations de Flushable et Closeable. Un exemple important étant Java.io.PrintWriter . Sa méthode close() n'appelle PAS flush().
(cliquez sur le lien pour voir le code source)

Cela pourrait expliquer pourquoi les développeurs appellent avec prudence flush() avant de fermer leurs flux. J'ai personnellement rencontré des bogues de production dans lesquels close() était appelé sur une instance de PrintWriter sans appeler d'abord flush().

3
Fabian