c# - 我可以在同一个 Stream 上使用多个 BinaryWriters 吗?

标签 c# .net

我能否创建一个新的 BinaryWriter 并在 Stream 上写入,而该流已被另一个 BinaryWriter 使用?

我需要递归地写入一些数据,但我想避免将 BinaryWriter 作为参数传递给方法,因为我需要传递一个 Stream。因此,每个将数据写入流的方法可能需要创建自己的 BinaryWriter 实例。但我不知道这对不对。目前,它在 FileStream 上运行良好,但我不知道它是否会在用户计算机上导致意外结果。

我写了一个简单的例子来说明我想要实现的目标。 BinaryWriter 的这种使用有误吗?

例子:

public Main()
{
    using (var ms = new MemoryStream())
    {
        // Write data on the stream.
        WriteData(ms);
    }
}

private void WriteData(Stream output)
{
    // Create and use a BinaryWriter to use only on this method.
    using (var bWriter = new BinaryWriter(output, Encoding.UTF8, true))
    {
        // Write some data using this BinaryWriter.
        bWriter.Write("example data string");
        // Send the stream to other method and write some more data there.
        WriteMoreData(output);
        // Write some more data using this BinaryWriter.
        bWriter.Write("another example data string");
    }
}

private void WriteMoreData(Stream output)
{
    // Create and use a BinaryWriter to use only on this method.
    using (var bWriter = new BinaryWriter(output, Encoding.Unicode, true))
    {
        // Write some data on this BinaryWriter.
        bWriter.Write("write even more example data here");
    }
}

最佳答案

Is this use of the BinaryWriter wrong?

它应该可以正常工作。 BinaryWriter 本身不进行缓冲,因此每个实例都不会干扰其他实例写入的数据。您正在为 leaveOpen 参数传递 true,因此当每个实例被释放时,它不会关闭底层流。

但“错”在某种程度上是旁观者的看法。我会说传递 BinaryWriter 会更好。

MemoryStream 没有缓冲,但其他类型有。 BinaryWriter 的每个实例在处理后都会刷新流。这可能被某些人认为是低效的,因为它至少部分地抵消了缓冲的好处。这不是问题,但可能不是养成的最佳习惯。

此外,BinaryWriter 的每个实例都将为垃圾收集器创建额外的工作。如果真的只有几个,那可能不是问题。但是如果真实世界的例子涉及更多的调用,那可能会开始变得明显,特别是当底层流是 MemoryStream 时(即你没有处理一些慢速设备 I/O) .

更重要的是,我没有看到在此处的同一流上使用多个 BinaryWriter 实例有任何明显的优势。看起来自然的、可读的、易于维护的事情是创建一个 BinaryWriter 并重复使用它直到你完成编写。

为什么要避免将其作为参数传递?您已经传递了 Stream。只需传递 BinaryWriter 即可。如果您确实需要直接访问底层流,它始终可以通过 BinaryWriter.BaseStream 访问。

底线:我不能说您的提案本身有任何明显错误的地方。但这是对正常惯例的偏离,没有(对我而言)明显的好处。如果你有一个很好的理由这样做,它应该有效。但我建议不要这样做。

关于c# - 我可以在同一个 Stream 上使用多个 BinaryWriters 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39156993/

相关文章:

c# - 如何使用 C# 从 ASP.Net 中的数据库中获取最新记录?

c# - 使用 MONO 降级 Web API 以在 Linux 上运行

c# - 描述 MVVM 模式的好网站

.net - 使用 ASP.NET Gridview 自定义模板字段

c# - 我的 WPF 组合框中的绑定(bind)不起作用?

c# - .NET 中的字符串标记

c# - 有没有办法将引用的 MonoBehaviours 序列化为 JSON?

c# - 我应该使用 basicHttpBinding 还是 WsHttpBinding 来创建安全的 Java 客户端?

.net - 数据绑定(bind) 101. 如何在 .Net 中进行

c# - 为什么空文本文件包含 3 个字节?