Qual è la differenza tra StreamWriter.Flush () e StreamWriter.Close ()?

Qual è la differenza di funzionalità tra StreamWriter.Flush() e StreamWriter.Close() ?

Quando i miei dati non venivano scritti correttamente su un file, ho aggiunto sia Flush() che Close() alla fine del mio codice. Tuttavia, mi sono reso conto che l’aggiunta di Flush() o Close() consentiva di scrivere correttamente i dati.

Non ero in grado di capire esattamente cosa fanno ognuno di questi metodi quando leggo i documenti MSDN; Ho solo capito che l’uno o l’altro è necessario per garantire che i dati siano scritti correttamente. Ogni ulteriore spiegazione sarebbe molto apprezzata.


Dove s è una stringa da scrivere, ecco come appare il mio codice al momento:

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

In base al feedback delle risposte, ho riscritto il mio codice in un blocco using , che implementa IDisposable e si occuperà automaticamente di scrivere il stream sul file quando l’object viene eliminato:

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

StreamWriter.Flush() può essere chiamato ogni volta che è necessario cancellare il buffer e il stream rimarrà aperto.

StreamWriter.Close() è per la chiusura del stream, a quel punto viene anche scaricato il buffer.

Ma non dovresti davvero chiamare uno di questi. Ogni volta che vedo un .Close() nel codice, lo prendo come un odore di codice, perché in genere significa che un’eccezione imprevista potrebbe far sì che la risorsa venga lasciata aperta. Quello che dovresti fare è creare la tua variabile StreamWriter in un blocco using, come questo:

 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() scaricherà qualsiasi cosa nel stream verso il file. Questo può essere fatto nel mezzo dell’uso dello Stream e puoi continuare a scrivere.

StreamWriter.Close() chiude il stream per la scrittura. Ciò include Flushing the Stream un’ultima volta.

C’è un modo migliore di fare le cose però. Poiché StreamWriter implementa IDisposable , è ansible racchiudere StreamWriter in un blocco using .

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

Dopo il blocco using , verrà chiamato Dispose … che arriverà per Flush e Close the Stream.

Ho avuto un caso in cui stavo scrivendo una stringa molto lunga a un StreamWriter con un sottostante MemoryStream. Il MemoryStream veniva consumato da qualcos’altro prima che lo scrittore e il stream fossero disposti.

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

Con stringhe molto lunghe, la fine della stringa veniva troncata. Questo è stato risolto chiamando il flush prima che il stream venisse usato. In alternativa avrei potuto impostare AutoFlush su true.

Flush forza per scrivere buffer su disco. Chiudi: chiude il stream e viene eseguita anche l’operazione di svuotamento interno

Da MSDN:

Colore: cancella tutti i buffer per il writer corrente e fa in modo che tutti i dati memorizzati nel buffer vengano scritti nel stream sottostante.

Chiudi: chiude l’object StreamWriter corrente e il stream sottostante.