web-dev-qa-db-ja.com

StreamWriter.flush()を実行する必要がありますか?

このC#コードを想定します。

_using (MemoryStream stream = new MemoryStream())
{
    StreamWriter normalWriter = new StreamWriter(stream);
    BinaryWriter binaryWriter = new BinaryWriter(stream);

    foreach(...)
    {
        binaryWriter.Write(number);
        normalWriter.WriteLine(name); //<~~ easier to reader afterward.
    }

    return MemoryStream.ToArray();
}
_

私の質問は次のとおりです。

  1. 順序を維持するためにループ内でフラッシュを使用する必要がありますか?
  2. MemoryStream.ToArray()を返すことは合法ですか?慣例としてusing-blockを使用していますが、混乱するのではないかと思います。
27
Nefzen

前の答えをスクラッチします-同じストリームの周りに2つのラッパーを使用していることに気づいていませんでした。それは私にはいくぶん危険を感じます。

いずれにせよ、私はStreamWriterBinaryWriterをそれぞれのusingブロックに配置します。

そうです、MemoryStreamToArray()を呼び出すことは合法です。データは破棄された後も保持されます。

本当に2つのラッパーを使用したい場合は、次のようにします。

_using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter normalWriter = new StreamWriter(stream))
    using (BinaryWriter binaryWriter = new BinaryWriter(stream))
    {
        foreach(...)
        {
            binaryWriter.Write(number);
            binaryWriter.Flush();
            normalWriter.WriteLine(name); //<~~ easier to read afterward.
            normalWriter.Flush();
        }
    }    
    return MemoryStream.ToArray();
}
_

ただし、同じストリームの周りに2つのラッパーを使用することには多少注意が必要です。奇数のデータになってしまわないように、各操作の後にそれぞれをフラッシュし続ける必要があります。 StreamWriterの-​​ AutoFlush プロパティをtrueに設定して状況を緩和することができ、IbelieveBinaryWriterは現在実際にはフラッシュを必要としません(つまり、データをバッファリングしません)が、それに依存するのは危険だと感じます。

バイナリデータとテキストデータを混在させる必要がある場合は、BinaryWriterを使用し、文字列のバイトを明示的に書き込み、Encoding.GetBytes(string)でフェッチします。

24
Jon Skeet

更新

この答えを気にしないでください、私は作家と混乱しました...


  1. いいえ、順序は保持されます(pdate:多分そうではありません)。いつかは思い出せませんが、フラッシュは他の状況で役立ちます/必要です。
  2. 私はそう思います、usingはすべてがうまくクリーンアップされることを確認します。
0
mbillard