Qual é a diferença entre StreamWriter.Flush () e StreamWriter.Close ()?

Qual é a diferença na funcionalidade entre StreamWriter.Flush() e StreamWriter.Close() ?

Quando meus dados não estavam sendo gravados corretamente em um arquivo, adicionei Flush() e Close() ao final do meu código. No entanto, percebi que adicionar Flush() ou Close() permitia que os dados fossem gravados corretamente.

Não consegui captar exatamente o que cada um desses methods faz quando leio os documentos do MSDN; Eu só descobri que um ou outro é necessário para garantir que os dados sejam escritos corretamente. Qualquer outra explicação seria muito apreciada.


Onde s é uma string a ser escrita, aqui está o meu código atualmente:

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

Com base no feedback das respostas, eu reescrevi meu código em um bloco using , que implementa IDisposable e automaticamente cuido de gravar o stream no arquivo quando o object é descartado:

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

StreamWriter.Flush() pode ser chamado sempre que você precisar limpar o buffer e o stream permanecerá aberto.

StreamWriter.Close() é para fechar o stream, momento em que o buffer também é liberado.

Mas você não deveria precisar ligar para nenhum desses dois. Toda vez que vejo um .Close() no código, tomo isso como um cheiro de código, porque geralmente significa que uma exceção inesperada poderia fazer com que o recurso ficasse aberto. O que você deve fazer, é criar sua variável StreamWriter em um bloco de uso, assim:

 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() irá liberar qualquer coisa no stream para o arquivo. Isso pode ser feito no meio do uso do Stream e você pode continuar a escrever.

StreamWriter.Close() fecha o stream para gravação. Isso inclui o Flushing the Stream uma última vez.

Existe uma maneira melhor de fazer as coisas. Como o StreamWriter implementa IDisposable , você pode envolver o StreamWriter em um bloco de using .

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

Após o bloco de using , Dispose será chamado … que irá liberar e fechar o stream para você.

Eu tive um caso onde eu estava escrevendo uma string muito longa para um StreamWriter com um MemoryStream subjacente. O MemoryStream estava sendo consumido por outra coisa antes que o gravador e o stream fossem descartados.

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

Com cordas muito longas, o final da corda estava sendo truncado. Isso foi resolvido chamando flush antes que o stream fosse usado. Como alternativa, eu poderia ter definido o AutoFlush como true.

Forçar forças para gravar o buffer no disco. Close – fecha o stream e a operação de descarga interna também é executada

Do MSDN:

Flush: limpa todos os buffers do gravador atual e faz com que todos os dados em buffer sejam gravados no stream subjacente.

Fechar: Fecha o object StreamWriter atual e o stream subjacente.