处理FileStream和BinaryReader

时间:2011-04-29 18:40:41

标签: c# .net

我有一个管理二进制文件访问的类。我想在第一次请求时打开这个文件,然后保持打开状态,直到我的类的实例被处理掉。我已经像这样实现了它:

public class SomeService : IDisposable
{
    private BinaryReader _reader;

    public int ServiceFunction(...)
    {
        if (_reader == null)
            CreateReader();

        // Do something with _reader and return a result
    }

    private void CreateReader()
    {
        var stream = new FileStream("myFile", FileMode.Open, FileAccess.Read);
        _reader = new BinaryReader(stream);
    }

    public void Dispose()
    {
        if (_reader != null)
            _reader.Dispose();
    }
}

然后我会这样使用这个类:

using (var service = new SomeService())
{
    foreach (var item in someList)
    {
        // other stuff
        if (eventuallyTrue)
        {
            int result = service.ServiceFunction(item.SomeProperty);
            // other stuff
        }
    }
}

问题:

  • 是否足以调用_reader.Dispose()或者是否有必要明确处理FileStream?
  • 如果我也需要处理FileStream,可以像这样修改Dispose方法:

    public void Dispose()
    {
        if (_reader != null)
        {
            if (_reader.BaseStream != null)
                _reader.BaseStream.Dispose();
            _reader.Dispose();
            // Does the order of disposing matter here ?
        }
    }
    
  • 或者我是否需要将FileStream保存在单独的类变量private FileStream _stream中并稍后处理此流?

3 个答案:

答案 0 :(得分:4)

处理_reader就足够了。

但这是因为读者特有的“特征”,它假定了流的所有权。

因此,作为2个相关或不相关的一次性用品的一般模式,它不会这样做。因此,我将Stream存储为_stream并将其最终处理,只是为了安全和一致。它肯定不会受到伤害。

答案 1 :(得分:2)

处理读取器将自动处理基础流,因此您无需明确地执行此操作。

答案 2 :(得分:2)

BinaryReader.Dispose和StreamReader.Dispose的当前实现始终强制将基础流设置为Disposed / Closed。没有解决方法。

可是:

Microsoft团队计划在下一版本的.NET中修复此问题。

http://connect.microsoft.com/VisualStudio/feedback/details/361389/allow-binaryreader-and-streamreader-to-wrap-a-stream-without-disposing-it