Quel est le but de flush () dans les flux Java?


121

En Java, la flush()méthode est utilisée dans les flux. Mais je ne comprends pas à quoi sert cette méthode?

fin.flush();

dites-moi quelques suggestions.

Réponses:


101

D'après la documentation de la flushméthode:

Vide le flux de sortie et force l'écriture de tous les octets de sortie mis en mémoire tampon. Le contrat général de flush est que son appel est une indication que, si des octets précédemment écrits ont été mis en mémoire tampon par l'implémentation du flux de sortie, ces octets doivent immédiatement être écrits vers leur destination prévue.

La mise en mémoire tampon est principalement effectuée pour améliorer les performances d'E / S. Pour en savoir plus, consultez cet article: Réglage des performances d'E / S Java .


1
Nouveau lien vers Tuning Java I / O Performance oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

+1 Merci. Je ne pouvais pas comprendre pourquoi mes octets n'étaient pas envoyés, et c'est parce que j'ai dû vider mes tampons.
rayryeng

3
La méthode flush est-elle utilisée uniquement avec les flux tamponnés? y a-t-il un avantage à l'utiliser avec d'autres flux (par exemple, le flux de sortie)?
tnishada

Peut-être que le mot «flush» ne devrait pas être dans sa définition. Les définitions récursives sont une mauvaise idée pour comprendre de nouvelles choses. Je sais que vous n'avez pas écrit la définition.
Jonathan Komar

27

Lorsque nous donnons une commande, les flux de cette commande sont stockés dans l'emplacement de mémoire appelé buffer (un emplacement de mémoire temporaire) dans notre ordinateur. Lorsque tout l'emplacement de la mémoire temporaire est plein, nous utilisons flush (), qui vide tous les flux de données et les exécute complètement et donne un nouvel espace aux nouveaux flux dans l'emplacement temporaire du tampon. -J'espère que vous comprendrez


1
Seulement dans le cas BufferedOutputStream, BufferedWriter, ObjectOutputStream,et les PrintXXXclasses. La flush()méthode de tout autre flux ou Writerne fait rien.
Marquis de Lorne

@EJP Des références pour sauvegarder vos déclarations? Ce serait utile pour nous les débutants :)
mr5

1
@ mr5 C'est l'affiche qui a besoin de sauvegarder ses déclarations, pas moi, mais tout ce que j'ai dit est clairement indiqué dans le Javadoc
Marquis of Lorne

L'appel flush()explicite n'est pas obligatoire pour a BufferedWriter, tant que vous êtes close()l'auteur. close()exécute un flush lui-même.
Yossarian42

Notez les close()appels flush(), donc appeler les deux est redondant lors de l'utilisation FileWritersans tampon.
Yossarian42

26

Lorsque vous écrivez des données dans un flux, elles ne sont pas écrites immédiatement et elles sont mises en mémoire tampon. Utilisez donc flush()lorsque vous devez être sûr que toutes vos données du tampon sont écrites.

Nous devons nous assurer que toutes les écritures sont terminées avant de fermer le flux, et c'est pourquoi il flush()est appelé dans le fichier / rédacteur en mémoire tampon close().

Mais si vous avez besoin que toutes vos écritures soient enregistrées à tout moment avant de fermer le flux, utilisez flush().


8
Appeler flush juste avant la fermeture est redondant, non? c'est la même chose que d'appeler simplement à proximité.
John Henckel

2
@BimanTripathy Je peux dire cela avec une assurance à 100%. Il est garanti par le Javadoc de FilterOutputStreamet FilterWriter.
Marquis de Lorne

7

Si la mémoire tampon est pleine, toutes les chaînes qui y sont mises en mémoire tampon seront enregistrées sur le disque. Les tampons sont utilisés pour éviter les grosses affaires! et les frais généraux.

Dans la classe BufferedWriter qui est placée dans les bibliothèques java, il y a une ligne comme:

private static int defaultCharBufferSize = 8192;

Si vous souhaitez envoyer des données avant que la mémoire tampon ne soit pleine, vous avez le contrôle. Rincez-le. Les appels à writer.flush () disent: "Envoyez tout ce qui est dans le tampon, maintenant!

livre de référence: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

pages: 453


4

Les flux sont souvent accédés par des threads qui vident périodiquement leur contenu et, par exemple, l'affiche à l'écran, l'envoie vers une socket ou l'écrit dans un fichier. Ceci est fait pour des raisons de performances. Le vidage d'un flux de sortie signifie que vous souhaitez arrêter, attendre que le contenu du flux soit complètement transféré vers sa destination, puis reprendre l'exécution avec le flux vide et le contenu envoyé.


5
C'est de la fantaisie. Les flux ne sont accessibles par aucun fil magique; uniquement ceux créés par l'application.
Marquis of Lorne le

3

Pour des problèmes de performances, les premières données doivent être écrites dans Buffer. Lorsque la mémoire tampon est pleine, les données sont écrites sur la sortie (fichier, console, etc.). Lorsque le tampon est partiellement rempli et que vous voulez l'envoyer vers la sortie (fichier, console), vous devez appeler la méthode flush () manuellement afin d'écrire le tampon partiellement rempli vers la sortie (fichier, console).


Ce n'est pas vrai. FileOutputStream.flush () est un no-op vide.
vertuso
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.