62 votes

Différence entre la fonction flush et close en cas de filewriter en java

Je dois savoir quelle est la différence exacte entre les fonctions flush et close en Java?

Et quand les données sont-elles vidées dans un fichier lors de l'écriture du fichier?

Veuillez fournir un exemple

79voto

Jon Skeet Points 692016

flush() sert juste à s'assurer que toutes les données mises en tampon sont écrites sur le disque (dans ce cas - de manière plus générale, vidées à travers n'importe quel canal d'E/S que vous utilisez). Vous pouvez toujours écrire sur le flux (ou le writer) par la suite.

close() vide les données et indique qu'il n'y a plus de données. Il ferme toutes les poignées de fichiers, les sockets ou tout ce qui est nécessaire. Vous ne pouvez alors plus écrire sur le flux (ou le writer).

Notez qu'en l'absence d'appels à flush(), des données peuvent encore être écrites sur le canal E/S en question - c'est juste que certaines données peuvent être mises en tampon.

close() appelle généralement aussi flush(), mais il m'a récemment été signalé que dans certaines implémentations de JDK, toutes les exceptions jetées lors du vidage dans le cadre de la fermeture sont avalées :(

64voto

Chandra Sekhar Points 6512

Flush() écrit le contenu du tampon vers la destination et vide le tampon pour stocker d'autres données, mais il ne ferme pas le flux définitivement. Cela signifie que vous pouvez toujours écrire d'autres données dans le flux.

Mais close() ferme le flux de manière permanente. Si vous voulez écrire d'autres données, vous devez réouvrir le flux et ajouter les données aux existantes.

0 votes

Lorsque l'on utilise BufferedWriter (ou BufferedReader), nous n'avons pas à nous soucier de flush() - le BufferedWriter effectue un vidage interne pendant "write()" chaque fois que le tampon est plein.

2 votes

Mais à la fin si le tampon n'est ni vide ni plein, et que nous voulons écrire cette dernière partie sur le disque (ce qui est presque toujours souhaitable), nous devons le flush() explicitement/manuellement, ce qui est très nécessaire.

2 votes

@WesternGun Non: invoquer flush() explicitement n'est pas nécessaire pour un BufferedWriter, tant que vous close() le writer. close() exécute un flush automatiquement.

6voto

shift66 Points 4964

flush() vide le contenu du tampon vers la destination. Et vous pouvez écrire quelque chose à nouveau dans le flux. close() vide le contenu vers la destination et ferme le flux. Après close(), vous ne pouvez plus écrire quoi que ce soit.

2 votes

Jon Skeet a écrit 15 secondes plus tôt))

3voto

Suresh Points 552

flush() : Pour vider le flux de sortie, utilisez la méthode void flush() de la classe DataOutputStream. Cette méthode appelle internalement la méthode flush() de la classe OutputStream sous-jacente qui force l'écriture de tout byte de sortie mis en mémoire tampon dans le flux.

close() : Cela ferme généralement le flux, la connexion, la socket.

Voir exemple de flush et close

0voto

MIKEC Points 106

La méthode flush va vider tout le contenu des flux vers la destination. Après avoir écrit quelque chose, cela peut ne pas être encore à la destination.

La méthode close va fermer les flux et effectuer le vidage avant de les fermer.

Voici ce que j'ai trouvé dans le tutoriel Oracle Java I/O.

Pour vider un flux manuellement, appelez sa méthode flush. La méthode flush est valable sur tout flux de sortie, mais n'a aucun effet à moins que le flux soit mis en mémoire tampon.

Si vous utilisez seulement fileWriter sans tampon, utiliser flush n'a aucun effet. La seule chose à faire est de fermer les flux. Et la méthode close va vider les flux avant de les fermer.

Si je comprends bien, il semble que tant que nous nous souvenons de fermer les flux, tout va bien.

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