我需要做StreamWriter.flush()吗?

Nef*_*zen 27 c# memorystream flush streamwriter

假设这个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();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我是否需要在循环内使用flush以保持顺序?
  2. 回归MemoryStream.ToArray()合法吗?我使用using-block作为约定,我担心它会搞砸了.

Jon*_*eet 24

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

无论哪种方式,我把StreamWriterBinaryWriter自己的using块.

哦,是的,调用它是合法ToArray()MemoryStream- 即使数据被处理后数据仍然保留.

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它会影响写入值的顺序 - 除非您将 AutoFlush 设置为 true,否则 StreamWriter 可能很长一段时间不会向 MemoryStream 写入任何内容(或者*永远*,如果您不处理它)。我只是觉得很脆弱。 (2认同)
  • @Nefzen - 请参阅Environment.NewLine http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx (2认同)