web-dev-qa-db-fra.com

flush dans Java.io.FileWriter

J'ai une question dans mon esprit que, lors de l'écriture dans le fichier, avant que la fermeture ne soit terminée, devrions-nous inclure flush () ??. Si oui, que fera-t-il exactement? ne diffuse pas le rinçage automatique? ÉDITER:

Alors vider ce qu'il fait réellement?

29
i2ijeya

Les écrivains et les flux mettent généralement en mémoire tampon certaines de vos données de sortie et essaient de les écrire dans des blocs plus gros à la fois. le vidage provoquera une écriture immédiate sur le disque à partir de la mémoire tampon, donc si le programme plante, les données ne seront pas perdues. Bien sûr, il n'y a aucune garantie, car le disque peut ne pas écrire physiquement les données immédiatement, donc il pourrait toujours être perdu. Mais alors ce ne serait pas la faute du programme Java) :)

PrintWriters vider automatiquement (par défaut) lorsque vous écrivez une fin de ligne, et bien sûr, les flux et les tampons sont vidés lorsque vous les fermez. À part cela, il n'y a de vidage que lorsque la mémoire tampon est pleine.

22
Carl Smotricz

Je recommanderais fortement d'appeler flush avant la fermeture. Fondamentalement, il écrit les données tamponnées restantes dans le fichier.

Si vous appelez explicitement flush, vous pouvez être sûr que tout IOException sortant de close est vraiment catastrophique et lié à la libération de ressources système.

Lorsque vous flush vous-même, vous pouvez gérer ses IOException de la même manière que vous gérez vos exceptions d'écriture de données.

21

Vous n'avez pas besoin de faire un flush car close () le fera pour vous.

Depuis le javadoc:

"Fermez le flux, en le vidant d'abord. Une fois qu'un flux a été fermé, d'autres appels write () ou flush () entraîneront la levée d'une IOException. La fermeture d'un flux précédemment fermé, cependant, n'a aucun effet."

13
Benj

Pour répondre à votre question sur ce que fait réellement flush, il s'assure que tout ce que vous avez écrit dans le flux - un fichier dans votre cas - est effectivement écrit dans le fichier à un moment donné.

Java peut effectuer une mise en mémoire tampon, ce qui signifie qu'il conservera les données écrites en mémoire jusqu'à ce qu'il en ait une certaine quantité, puis les écrit toutes dans le fichier en une seule fois, ce qui est plus efficace. L'inconvénient est que le fichier n'est pas nécessairement à jour à un moment donné. Flush est une manière de dire "mettre à jour le fichier.

Fermez d'abord les appels pour vous assurer qu'après la fermeture, le fichier contient ce que vous vous attendez à voir, donc comme d'autres l'ont souligné, il n'est pas nécessaire de vider avant de fermer.

4
user15299

Fermez automatiquement les rinçages. Vous n'avez pas besoin de l'appeler.

3
Ry4an Brase

Il est inutile d'appeler flush () juste avant un close (), comme d'autres l'ont dit. Il est temps d'utiliser flush () si vous gardez le fichier ouvert mais que vous voulez vous assurer que les écritures précédentes ont été complètement terminées.

1
Dave Costa

FileWriter est une classe maléfique car elle récupère le jeu de caractères qui s'y trouve, plutôt que de prendre un jeu de caractères explicite. Même si vous voulez la valeur par défaut, soyez explicite à ce sujet.

La solution habituelle est OutputStreamWriter et FileOutputStream. Il est possible pour le décorateur de lancer une exception. Par conséquent, vous devez être en mesure de fermer le flux même si l'écrivain n'a jamais été construit. Si vous comptez faire cela, il vous suffit de vider le rédacteur (dans le cas heureux) et de toujours fermer le flux. (Juste pour être déroutant, certains décorateurs, par exemple pour gérer les zips, ont des ressources qui doivent être fermées.)

1

Comme dit, vous n'avez généralement pas besoin de rincer.

Cela n'a de sens que si, pour une raison quelconque, vous souhaitez qu'un autre processus voie le contenu complet d'un fichier avec lequel vous travaillez, sans le fermer. Par exemple, il pourrait être utilisé pour un fichier qui est modifié simultanément par plusieurs processus, bien qu'avec BEAUCOUP d'attention :-)

1
Federico Giorgi

Un autre cas d'utilisation pour le vidage dans le programme est l'écriture de la progression du travail de longue durée dans le fichier (afin qu'il puisse être arrêté et redémarré plus tard. Vous voulez être sûr que les données sont en sécurité sur le lecteur.

while (true) {
  computeStuff();
  progresss += 1;
  out.write(String.format("%d", progress));
  out.flush();
}
out.close();
1
Vojtech Salbaba