我需要做StreamWriter.flush()吗?

问题描述 投票:27回答:2

假设这个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作为惯例,我担心它会搞砸。
c# flush memorystream streamwriter
2个回答
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();
}

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

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


0
投票

更新

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


  1. 不,订单将被保留(更新:可能不会)。在其他情况下,Flush是有用/需要的,尽管我不记得什么时候。
  2. 我想是的,使用确保一切都很好地清理。
© www.soinside.com 2019 - 2024. All rights reserved.