¿Cuál es la diferencia entre StreamWriter.Flush () y StreamWriter.Close ()?

¿Cuál es la diferencia de funcionalidad entre StreamWriter.Flush() y StreamWriter.Close() ?

Cuando mis datos no se escribían correctamente en un archivo, agregué Flush() y Close() al final de mi código. Sin embargo, me di cuenta de que agregar Flush() o Close() permitía que los datos se escribieran correctamente.

No pude ver exactamente qué hace cada uno de estos métodos cuando leo los documentos de MSDN; Solo descubrí que uno u otro es necesario para garantizar que los datos estén escritos correctamente. Cualquier otra explicación sería muy apreciada.


Donde s se escribe una cadena, así es como se ve mi código actualmente:

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

En base a los comentarios de las respuestas, reescribí mi código en un bloque de using , que implementa IDisposable y se encargará automáticamente de escribir la secuencia en el archivo cuando se IDisposable el objeto:

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

StreamWriter.Flush() puede StreamWriter.Flush() cada vez que necesite borrar el búfer, y la transmisión permanecerá abierta.

StreamWriter.Close() es para cerrar la secuencia, en cuyo punto también se vacía el búfer.

Pero realmente no deberías necesitar llamar a ninguno de estos. Cada vez que veo un .Close() en el código lo tomo como un olor a código, porque generalmente significa que una excepción inesperada podría dejar el recurso abierto. Lo que debes hacer es crear tu variable StreamWriter en un bloque de uso, como este:

 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() cualquier cosa en el Stream al archivo. Esto se puede hacer en el medio de usar Stream y puede seguir escribiendo.

StreamWriter.Close() cierra el flujo para escritura. Esto incluye Flushing the Stream por última vez.

Sin embargo, hay una mejor manera de hacer las cosas. Como StreamWriter implementa IDisposable , puede ajustar StreamWriter en un bloque de using .

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

Después del bloque de using , se llamará a Dispose … que vaciará y cerrará el flujo por ti.

Tuve un caso en el que estaba escribiendo una cadena muy larga a un StreamWriter con un MemoryStream subyacente. El MemoryStream estaba siendo consumido por otra cosa antes de que el escritor y la transmisión fueran eliminados.

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

Con cadenas realmente largas, el final de la cadena se estaba truncando. Esto se resolvió llamando al color antes de usar la transmisión. Alternativamente, podría haber configurado AutoFlush en verdadero.

Fuerzas de descarga para escribir búfer en el disco. Cerrar: cierra el flujo y la operación de lavado interno también se realiza

Desde MSDN:

Flush: borra todos los buffers del escritor actual y hace que los datos almacenados en el búfer se escriban en el flujo subyacente.

Cerrar: cierra el objeto StreamWriter actual y la secuencia subyacente.