69 votes

Quelle est la différence entre StreamWriter.Flush () et StreamWriter.Close ()?

Qu'est-ce que la différence de fonctionnalités entre StreamWriter.Flush() et StreamWriter.Close()?

Lors de mes données n'a pas été correctement écrites dans un fichier, j'ai ajouté les deux Flush() et Close() à la fin de mon code. Cependant, j'ai réalisé que l'ajout soit de l' Flush() ou Close() admis que les données soient écrites correctement.

Je n'étais pas en mesure de revenir sur exactement ce que chacune de ces méthodes n'quand j'ai lu le MSDN docs; j'ai seulement compris que l'un ou l'autre est nécessaire pour assurer que les données sont écrites correctement. Plus d'explication serait très apprécié.


s est une chaîne de caractères à écrire, voici ce que mon code ressemble actuellement:

        StreamWriter sw = File.CreateText("TextOutput.txt");
        sw.Write(s);
        sw.Flush();
        sw.Close();

Basé sur les commentaires des réponses, j'ai réécrit mon code dans une using bloc, qui implémente IDisposable et occupera automatiquement de la rédaction du flux de données vers le fichier lorsque l'objet est disposé:

        using (StreamWriter sw = File.CreateText("TextOutput.txt"))
        {
            sw.Write(s);
        }

131voto

Joel Coehoorn Points 190579

StreamWriter.Flush() peut être appelée à tout moment vous avez besoin d'effacer la mémoire tampon, et le flux restera ouverte.

StreamWriter.Close() est pour la fermeture de la voie, à quel point la mémoire tampon est également vidé.

Mais vous ne devriez pas vraiment besoin d'appeler l'un de ces. Toutes les fois que je vois un .Close() dans le code je prends ça comme une odeur de code, car il signifie généralement une exception inattendue pourrait causer de la ressource qui doit être laissée ouverte. Ce que vous devez faire, est de créer votre StreamWriter variable dans un bloc using, comme ceci:

using (var writer = new StreamWriter("somefilepath.txt"))
{
   // write a bunch of stuff here
} // the streamwriter WILL be closed and flushed here, even if an exception is thrown.

16voto

Justin Niessner Points 144953

StreamWriter.Flush() vider quelque chose dans le Flux de données dans le fichier. Cela peut être fait dans le milieu d'utiliser le Flux de données et vous pouvez continuer à écrire.

StreamWriter.Close() ferme le Flux de l'écriture. Cela comprend Rinçage de la Flux, une dernière fois.

Il y a une meilleure façon de faire les choses bien. Depuis StreamWriter implémente IDisposable, vous pouvez enrouler le StreamWriter en using bloc.

using(StreamWriter sw = new StreamWriter(stream))
{
     // Work with things here
}

Après l' using bloc, Dispose sera appelé...qui va vider et Fermer le Flux de données pour vous.

6voto

Bronumski Points 5754

J'avais un cas où j'écrivais une très longue chaîne sur un StreamWriter avec un MemoryStream sous-jacent. MemoryStream était en train d'être consommé par autre chose avant que le rédacteur et le flux aient été éliminés.

 using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream , Encoding.UTF8))
{
    streamWriter.Write(someRealyLongStringValue);
    DoSomethingWithTheStream(memoryStream );
}
 

Avec de très longues chaînes, la fin de la chaîne était tronquée. Cela a été résolu en appelant flush avant que le flux ne soit utilisé. Sinon, j'aurais pu définir AutoFlush sur true.

1voto

Andrey Points 36869

Flush oblige à écrire le tampon sur le disque. Fermer - ferme le flux et le rinçage interne est également effectué

1voto

thelost Points 4691

De MSDN:

Flush: efface tous les tampons pour le rédacteur en cours et entraîne l'écriture de toutes les données mises en tampon dans le flux sous-jacent.

Fermer: ferme l'objet StreamWriter actuel et le flux sous-jacent.

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