我需要做StreamWriter.flush()吗?

时间:2009-06-29 16:10:30

标签: c# flush memorystream 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();
}

我的问题是:

  1. 我是否需要在里面使用冲洗 循环以保持秩序?
  2. 归还MemoryStream.ToArray()合法吗?我使用using - 块作为约定,我担心它会搞砸。

2 个答案:

答案 0 :(得分: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();
}

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

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

答案 1 :(得分:0)

<强>更新

没关系,我对作家感到困惑......


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