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);
}
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.
StreamWriter.Flush()
は、ストリーム内のすべてをファイルにフラッシュします。これは、ストリームの使用中に行うことができ、書き込みを続行できます。
StreamWriter.Close()
は、書き込みのためにストリームを閉じます。これには、ストリームの最後の1回のフラッシュが含まれます。
しかし、物事を行うためのより良い方法があります。 StreamWriterはIDisposable
を実装するため、using
ブロックでStreamWriterをラップできます。
using(StreamWriter sw = new StreamWriter(stream))
{
// Work with things here
}
using
ブロックの後、Dispose
が呼び出されます...これにより、ストリームがフラッシュされて閉じられます。
基礎となるMemoryStreamを使用して、非常に長い文字列をStreamWriterに書き込む場合がありました。ライターとストリームが破棄される前に、MemoryStreamが他の何かによって消費されていました。
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream , Encoding.UTF8))
{
streamWriter.Write(someRealyLongStringValue);
DoSomethingWithTheStream(memoryStream );
}
本当に長い文字列では、文字列の終わりが切り捨てられていました。これは、ストリームが使用される前にflushを呼び出すことで解決されました。あるいは、AutoFlushをtrueに設定することもできます。
フラッシュは、バッファをディスクに強制的に書き込みます。閉じる-ストリームを閉じ、内部フラッシュ操作も実行されます
MSDNから:
フラッシュ:現在のライターのすべてのバッファをクリアし、バッファされたデータを基になるストリームに書き込みます。
閉じる:現在のStreamWriterオブジェクトと基になるストリームを閉じます。