2010-12-16 108 views
16

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

是在内存/资源管理等方面的安全,不能关上一个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 
    } 
} 
+2

这个问题可能会有所帮助:http://stackoverflow.com /问题/ 1862261 /可任您保持-A-的StreamReader - 从配置用最底层的流 – 2010-12-16 22:09:44

+1

不相关的问题,但因为包装不“拥有”流,你可能想也节省了原始'_underlyingStream.Position'并在返回给调用者之前将其恢复到ReadToEnd()之后的那个位置。 (虽然,您的使用可能会使呼叫者期望此位置受到此类呼叫的影响 - 并且如果它很重要,可以自行保存位置。) – 2016-03-22 22:49:16

回答

5

如果没有人关闭了流,那么最终的终结将被调用这应该叫处置和关闭它们在GC。但这在资源方面非常糟糕,因为它留下了分配给GC的任何可能的昂贵资源。它可能变得更糟的时间越长你的对象的生命,尤其是如果它生存的集合晋升为第1代或甚至2

这肯定将是很好,如果你可以提出一些你的调用者分离这一点。也许你可以从流中缓存某些内容,以便在向调用者提供内容的同时关闭它。

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

0

它确定地不好。 read this from msdn

密切调用Dispose方法传递一个真正的价值。 刷新流不会刷新其底层编码器,除非您显式调用Close。

尝试封装所有IO在一类。

+0

我不太赞同。为什么不冲淡底层编码器是一件坏事?你有什么链接方便吗? – 2010-12-16 22:19:46

+1

冲洗是一回事,但令人烦恼的是包装的处置也始终处理流。您通常仍然想从更高级别访问它。 – Nyerguds 2016-03-15 11:51:03

相关问题