如果我需要保留“包裹”流,我应该处理BinaryReader吗?

时间:2012-08-29 16:13:00

标签: c# .net stream dispose

BinaryReader constructors都需要一个流参数。如果我在完成BinaryReader后需要保持基础流的原样,我还应该调用它Dispose()吗?如果没有,是否还有其他需要清理的不再需要BinaryReader

我问,因为我无法在MSDN page for BinaryReader.Dispose()上找到明确的答案。

小额添加

在我的上下文中,我使用BinaryReader读取几个字节,之后我将流的位置设置回BinaryReader初始化之前的位置。

另外,我正在使用.Net 4。

4 个答案:

答案 0 :(得分:13)

如果您(或其他任何阅读这些内容的人正在寻找答案)正在使用VS 2012和.NET 4.5(或更高版本),您可以创建一个不会关闭流的BinaryReader。 E.g:

using(var reader = new BinaryReader(theStream, new UTF8Encoding(), true)
{
//...
}
如果您使用BinaryReader(Stream)构造函数,则

new UTF8Encoding是默认值,如果您不想使用UTF8Encoding,则可以使用其他内容。 true表示“是,将流保持打开状态”。

答案 1 :(得分:11)

不,如果你想保持流畅通,可以不处理BinaryReader

我可能会添加评论来解释发生了什么 - 而且我不确定它是否保证 BinaryReader只会从流中读取到目前为止你已经从BinaryReader中读到了......例如,它可能已经读到了更多的缓冲区。显然,如果你在流上寻找,那不是问题。

答案 2 :(得分:3)

已经有一个公认的答案,但它让我觉得很脏:-)我认为我们可以做得更好:

  1. 如果您使用的是.NET 4.5,则应使用BinaryReader的3-arg构造函数。完成。
  2. 如果您使用的是.NET 3.5 / 4.0,则需要一个不同的解决方案
  3. Jon Skeet(接受的答案)建议永远不要丢弃BinaryReader。那么,这是一种行为,但可能会引起混乱。

    另一种解决方案可能是将Stream包装在NonClosingStreamWrapper中,然后再将其传递给BinaryReader。 BinaryReader将在处理时关闭包装器,但NonClosingStreamWrapper将不会处理您的基础Stream。你仍然可以在binaryStream上使用.Dispose(甚至更好的是使用模式)。

    非常具有讽刺意味的是,@ JonSkeet已经创建了一个NonClosingStreamWrapper来做到这一点。这是他miscutil library的一部分。 (但请注意许可证)

    using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream)))
    {
    //...
    }
    

答案 3 :(得分:2)

如果是我,我会处理BinaryReader,只是为了整洁......但我也确保用this constructor overload创建了BinaryReader

public BinaryReader(
  Stream   input,
  Encoding encoding,
  bool     leaveOpen
  )

leaveOpen参数指定为true,指示读者将基础流保持打开状态。

走这条路,你明确了事物的范围和所有权。通过这种方式减少混淆和误解的空间。