web-dev-qa-db-ja.com

StreamWriter.Flush()とStreamWriter.Close()の違いは何ですか?

StreamWriter.Flush()StreamWriter.Close()の機能の違いは何ですか?

データがファイルに正しく書き込まれなかったとき、コードの最後にFlush()Close()の両方を追加しました。ただし、eitherFlush()またはClose()を追加すると、データを正しく書き込むことができることに気付きました。

MSDNのドキュメントを読んだときに、これらの各メソッドが何をするかを正確に把握できませんでした。データが正しく書き込まれるようにするには、どちらか一方だけが必要であることがわかりました。それ以上の説明は大歓迎です。


sは書き込まれる文字列です。現在、私のコードは次のようになっています。

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

回答からのフィードバックに基づいて、usingブロックを使用してコードを書き直しました。これはIDisposableを実装し、オブジェクトが破棄されたときにファイルへのストリームの書き込みを自動的に処理します。

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

StreamWriter.Flush()は、バッファをクリアする必要があるときにいつでも呼び出すことができ、ストリームは開いたままになります。

StreamWriter.Close()はストリームを閉じるためのもので、その時点でバッファーもフラッシュされます。

ただし、これらのいずれかを実際に呼び出す必要はありません。コードに.Close()が表示されるときはいつでも、コードの匂いとして受け取ります。これは通常、予期しない例外が原因でリソースが開いたままになる可能性があるためです。 shouldで行うことは、次のようにusingブロックにStreamWriter変数を作成することです。

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.
106
Joel Coehoorn

StreamWriter.Flush()は、ストリーム内のすべてをファイルにフラッシュします。これは、ストリームの使用中に行うことができ、書き込みを続行できます。

StreamWriter.Close()は、書き込みのためにストリームを閉じます。これには、ストリームの最後の1回のフラッシュが含まれます。

しかし、物事を行うためのより良い方法があります。 StreamWriterはIDisposableを実装するため、usingブロックでStreamWriterをラップできます。

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

usingブロックの後、Disposeが呼び出されます...これにより、ストリームがフラッシュされて閉じられます。

12
Justin Niessner

基礎となるMemoryStreamを使用して、非常に長い文字列をStreamWriterに書き込む場合がありました。ライターとストリームが破棄される前に、MemoryStreamが他の何かによって消費されていました。

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

本当に長い文字列では、文字列の終わりが切り捨てられていました。これは、ストリームが使用される前にflushを呼び出すことで解決されました。あるいは、AutoFlushをtrueに設定することもできます。

5
Bronumski

フラッシュは、バッファをディスクに強制的に書き込みます。閉じる-ストリームを閉じ、内部フラッシュ操作も実行されます

1
Andrey

MSDNから:

フラッシュ:現在のライターのすべてのバッファをクリアし、バッファされたデータを基になるストリームに書き込みます。

閉じる:現在のStreamWriterオブジェクトと基になるストリームを閉じます。

0
thelost