是不是可以不关闭StreamReader / StreamWriter来保持底层流打开?

时间:2010-12-16 22:06:03

标签: c# stream

我有一个基本上包装Stream用于读/写的类,但该流预计由该类的使用者管理。为了便于使用,我使用StreamReader和StreamWriter类在流上执行I / O操作。通常情况下,我会将读取器和写入器封装在using块中,但我想避免关闭读取器和写入器,因为这样做也会关闭底层流,我必须保持打开状态。

如果我希望调用者可以管理基础Stream,那么在内存/资源管理方面是否安全不关闭StreamReader / StreamWriter?当流在其他地方明确关闭时,读写器是否会被垃圾收集?

public class Wrapper 
{
    private Stream _underlyingStream;
    public Wrapper(Stream underlyingStream) 
    {
        _underlyingStream = underlyingStream;
    }

    public string GetValue() 
    {
        _underlyingStream.Seek(0, SeekOrigin.Begin);
        var reader = new StreamReader(_underlyingStream);
        return reader.ReadToEnd(); // we're done, but the stream is not ours to close
    }
}

3 个答案:

答案 0 :(得分:4)

如果没有人关闭流,那么最终将调用终结器,它应该调用dispose并在GC上关闭它们。但这在资源方面相当不错,因为它会留下任何可能昂贵的资源,直到GC。你的物体存在的时间越长,情况就会越糟,特别是如果它能够保存到第1代甚至2代的藏品中。

如果你能向你的来电者提供隔离的东西,那肯定会很好。也许你可以从流中缓存一些内容,这样你就可以在仍然向调用者提供内容的同时关闭它?

编辑后

编辑:现在,我看到您的来电者通过了您的操作流,我的答案必须与众不同!很明显,您的调用者应该管理流的生命周期。我最初的印象是,你的班级创建了一个流,并希望调用者管理它。

答案 1 :(得分:1)

解决此问题的最简单方法是将流包装在您自己的类中,该类派生自System.IO.Stream

实施例: http://csharptest.net/browse/src/Library/IO/NonClosingStream.cs

答案 2 :(得分:0)

这是不正确的。 read this from msdn

close调用Dispose方法传递一个true值。 除非您明确调用Close,否则刷新流不会刷新其底层编码器。

尝试将所有IO封装在一个类中。