繁体   English   中英

C# 刷新 StreamWriter 和 MemoryStream

[英]C# flushing StreamWriter and a MemoryStream

我使用以下代码片段,但不确定是否需要调用Flush方法(一次在StreamWriter ,一次在MemoryStream ):

    //converts an xsd object to the corresponding xml string, using the UTF8 encoding
    public string Serialize(T t)
    {
        using (var memoryStream = new MemoryStream())
        {
            var encoding = new UTF8Encoding(false);

            using (var writer = new StreamWriter(memoryStream, encoding))
            {
                var serializer = new XmlSerializer(typeof (T));
                serializer.Serialize(writer, t);
                writer.Flush();
            }

            memoryStream.Flush();

            return encoding.GetString(memoryStream.ToArray());
        }
    }

首先,因为代码在using块内,我认为自动调用的 dispose 方法可能会为我做这件事。 这是真的,还是冲洗是一个完全不同的概念?

根据stackoverflow本身:

Flush 意思是清除流的所有缓冲区,并使任何缓冲的数据写入底层设备。

在上述代码的上下文中,这意味着什么?

其次, MemoryStream的 flush 方法根据 api 什么也不做,那是怎么回事? 为什么我们调用一个什么都不做的方法?

您不需要在StreamWriter上使用Flush ,因为您正在处理它(通过将它放在using块中)。 当它被处理掉时,它会自动冲洗和关闭。

您不需要在MemoryStream上使用Flush ,因为它不会缓冲写入任何其他源的任何内容。 根本没有什么可以冲洗的地方。

Flush方法只存在于MemoryStream对象中,因为它继承自Stream类。 您可以在MemoryStream源代码中看到, flush方法实际上什么都不做。

通常,Streams 将在写入数据时缓冲数据(如果有相关设备,则定期将缓冲区刷新到相关设备),因为写入设备(通常是文件)的成本很高。 MemoryStream 写入 RAM,因此缓冲和刷新的整个概念是多余的。 数据总是已经在 RAM 中了。

是的,处理流将导致它被刷新。

评论刷新方法返回空字节 [],虽然我正在使用 Using 块

     byte[] filecontent = null;
        using var ms = new MemoryStream();
        using var sw = new StreamWriter(fs);
        sw.WriteCSVLine(new[] { "A", "B" });//This is extension to write as CSV
        //tx.Flush();
        //fs.Flush();
        fs.Position = 0;
        filecontent = fs.ToArray();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM