2009-06-29 55 views
27

は、このC#コードを仮定しますStreamWriter.flush()を実行する必要がありますか?

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ブロックを使用していますが、私はそれを混乱させる恐れがあります。

答えて

24

以前の回答をスクラッチ - 同じストリームで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人のラッパーを使用しての、やや警戒です。奇妙なデータで終わらないように、各操作の後にそれぞれをフラッシュしておく必要があります。あなたは、状況を緩和するためにtrueにStreamWriterAutoFlushプロパティを設定することができ、私はBinaryWriterことは、現在、実際にフラッシング(すなわち、それはすべてのデータをバッファリングしない)が、それは危険な感じに頼る必要はありません。信じて

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

+0

2つのストリームライターで1つのストリームをラップすると、危険な/エラーが発生しやすいように見えますが、この場合、フラッシングは何も行いません。 FlushはMemoryStreamの読み込みに影響せず、バッファされたバイトをそれぞれのストリームに書き込むだけです。 – mbillard

+1

これは、値の書き方に影響しますが、AutoFlushをtrueに設定しない限り、StreamWriterは何かをMemoryStreamに長時間書き込むことはできません。それはちょうど私に脆いと感じる。 –

+0

問題は、名前の最後に改行が必要なことです.WriteLineは安全な方法です。 – Nefzen

0

更新

ネヴァーマインドはこの答え、私は...作家と混同してしまった

  1. いいえ、順序は保持されます

    更新:たぶんません)。フラッシュは他の状況では便利ですが、いつ覚えていないのでしょうか。
  2. だから、を使用すると、を使用するとすべてがうまくクリーンアップされます。
+0

バイナリライターとストリームライターの間で、オーダー*が必然的に保存されるとは思えません。バイナリライターから次のバッファーの値をストリームライターにロードしてしまいます。 –

+0

1.注文は保存されません。 2. 'using'はnormalWriterまたはbinaryWriterを' Dispose() 'しません。 – dss539

+0

両方のライターが同じバッファを共有していますか? – mbillard

関連する問題