Quelle est la différence de fonctionnalité entre StreamWriter.Flush()
et StreamWriter.Close()
?
Lorsque mes données n'étaient pas écrites correctement dans un fichier, j'ai ajouté les fonctions Flush()
et Close()
à la fin de mon code. Cependant, je me suis rendu compte que l'ajout de soit Flush()
ou Close()
permettait aux données d'être écrites correctement.
Je ne pouvais pas comprendre exactement ce que chacune de ces méthodes faisait quand je lis les documents MSDN; J'ai seulement compris que l'un ou l'autre est nécessaire pour garantir que les données sont écrites correctement. Toute explication supplémentaire serait très appréciée.
Où s
est une chaîne à écrire, voici à quoi ressemble mon code:
StreamWriter sw = File.CreateText("TextOutput.txt");
sw.Write(s);
sw.Flush();
sw.Close();
Sur la base des retours des réponses, j'ai réécrit mon code dans un bloc using
, qui implémente IDisposable
et se charge automatiquement d'écrire le flux dans le fichier lorsque l'objet est supprimé:
using (StreamWriter sw = File.CreateText("TextOutput.txt"))
{
sw.Write(s);
}
StreamWriter.Flush()
peut être appelé à tout moment pour vider le tampon et le flux restera ouvert.
StreamWriter.Close()
est pour fermer le flux, à quel point le tampon est également vidé.
Mais vous ne devriez pas vraiment avoir besoin d'appeler l'un ou l'autre. Chaque fois que je vois un .Close()
dans le code, je considère cela comme une odeur de code, car cela signifie généralement qu'une exception inattendue pourrait entraîner l'ouverture de la ressource. Ce que vous devriez faites, créez votre variable StreamWriter
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.
StreamWriter.Flush()
videra le fichier de tout élément du flux. Cela peut être fait en cours d'utilisation du Stream et vous pouvez continuer à écrire.
StreamWriter.Close()
ferme le flux en écriture. Cela inclut le dernier rinçage du flux.
Il y a cependant une meilleure façon de faire les choses. Étant donné que StreamWriter implémente IDisposable
, vous pouvez envelopper StreamWriter dans un bloc using
.
using(StreamWriter sw = new StreamWriter(stream))
{
// Work with things here
}
Après le bloc using
, Dispose
sera appelé ... ce qui videra et fermera le flux pour vous.
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.
Flush oblige à écrire le tampon sur le disque. Fermer - ferme le flux, et l'opération de rinçage interne est également effectuée
De MSDN:
Flush: efface tous les tampons pour le rédacteur actuel 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.