是否处置的StreamReader关闭流?是否处置的StreamReader关闭流?(Does di

2019-05-14 08:49发布

我送一个流的方法来写,并在这些方法中我使用的是二进制读取/ wrtier。 当读取器/写入器被设置,或者通过using或者只是在不引用它,在流关闭以及??

我会派一个BinaryReader在/作家,但我使用一个StreamReader过(也许我应该去解决这一问题。我只使用,对于函数getline和readline)。 这是很麻烦的,如果每次写入/读取器被关闭时关闭该流。

Answer 1:

是的, StreamReaderStreamWriterBinaryReaderBinaryWriter全部关闭/处置其底层流时,你叫Dispose他们。 如果读/写器只是垃圾回收虽然他们处分流的-你应该总是处置读/写器,preferrably有using说明。 (事实上​​,所有这些类都有终结,也不应该有。)

我个人更喜欢有一个using语句流为好。 您可以嵌套using语句没有括号很整齐:

using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}

即使using语句流是有些多余的(除非StreamReader构造函数抛出异常),我认为这是最好的做法是那么如果你摆脱了StreamReader ,只是直接使用流在以后的日子,你已经有正确处理语义。



Answer 2:

这是一个古老的一个,但我想今天做类似的事情,发现一切都变了。 由于.NET 4.5,还有一个leaveOpen参数:

public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen )

唯一的问题是,它并不完全是什么明显为其他参数设置。 下面是一些帮助:

该MSDN页面的StreamReader的构造函数(流):

此构造初始化编码UTF8Encoding,使用流参数BaseStream属性和内部缓冲器大小为1024个字节。

这只是叶detectEncodingFromByteOrderMarks其判断的源代码true

public StreamReader(Stream stream)
        : this(stream, true) {
}

public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)
        : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {
}

如果其中的一些违约的暴露这将是很好,或者如果论据是可选的,所以,我们可以只指定了我们需要的人。



Answer 3:

是的,它确实。 您可以通过查看与反射器实施验证这一点。

protected override void Dispose(bool disposing)
{
    try
    {
        if ((this.Closable && disposing) && (this.stream != null))
        {
            this.stream.Close();
        }
    }
    finally
    {
        if (this.Closable && (this.stream != null))
        {    
            this.stream = null;    
            this.encoding = null;
            this.decoder = null;
            this.byteBuffer = null;
            this.charBuffer = null;
            this.charPos = 0;
            this.charLen = 0;
            base.Dispose(disposing);
        }
    }
}


Answer 4:

六年晚,但也许这会帮助别人。

的StreamReader做它被设置时关闭连接。 然而,“使用(流流= ...){...}”与的StreamReader / StreamWriter的可以导致流被布置两次:(1)当StreamReader对象被设置(2),并且当流使用块关闭。 运行VS代码分析时,这导致CA2202警告。

另一种解决方案,直接取自CA2202页,是用一个try / finally块。 设置正确的话,这只会关闭连接一次。

附近的底部CA2202 ,微软建议使用以下命令:

Stream stream = null;
try
{
    stream = new FileStream("file.txt", FileMode.OpenOrCreate);
    using (StreamWriter writer = new StreamWriter(stream))
    {
        stream = null;
        // Use the writer object...
    }
}
finally
{
    if(stream != null)
        stream.Dispose();
}

代替...

// Generates a CA2202 warning
using (Stream stream = new FileStream("file.txt", FileMode.Open))
using (XmlReader reader = new XmlReader (stream))
{
    // Use the reader object...
}


Answer 5:

是。 呼吁和IDisposable接口的Dispose()(其中“使用”一样)应该作出对象清理其所有资源。 这包括流冲洗,并关闭其文件描述符。

如果,你的情况,你想把它传递给其他的方法,那么你需要确保这些方法没有做好自己的读/写在使用块。



Answer 6:

如果你需要是覆盖的StreamWriter类Dispose方法一个简单的方法来解决这个问题。 请参见我的文章在这里就如何做到这一点的代码:

是否.Disposing一个StreamWriter关闭底层流?



Answer 7:

流设置或者通过“使用”关键字或调用dispose明确地



文章来源: Does disposing streamreader close the stream?