我需要做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. 我是否需要在循环内使用flush以保持顺序?
  2. 返回MemoryStream.ToArray()合法吗? 我使用using -block作为约定,我担心它会搞砸。

抓住前一个答案 – 我没有注意到你在同一个流周围使用了两个包装器。 这对我来说有些冒险。

无论哪种方式,我都会将StreamWriterBinaryWriter放在他们自己的块中。

哦,是的,在MemoryStream上调用ToArray()是合法的 – 即使数据被丢弃也会保留数据。

如果你真的想使用这两个包装器,我会这样做:

 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(); } 

我不得不说,我有点担心在同一个流周围使用两个包装器。 每次操作后你都必须不断刷新它们,以确保你不会得到奇怪的数据。 您可以将StreamWriterAutoFlush属性设置为true以缓解这种情况,我相信 BinaryWriter目前实际上并不需要刷新(即它不会缓冲任何数据),但依赖于此感觉风险很大。

如果你必须混合使用二进制和文本数据,我会使用BinaryWriter并显式写入字符串的字节,并使用Encoding.GetBytes(string)获取它。

更新

没关系这个答案,我和作家混淆了……


  1. 不,订单将被保留( 更新:可能不会)。 在其他情况下,Flush是有用的/需要的,虽然我不记得什么时候。
  2. 我想是的, 使用确保一切都很好地清理。