我送一个流的方法来写,并在这些方法中我使用的是二进制读取/ wrtier。 当读取器/写入器被设置,或者通过using
或者只是在不引用它,在流关闭以及??
我会派一个BinaryReader在/作家,但我使用一个StreamReader过(也许我应该去解决这一问题。我只使用,对于函数getline和readline)。 这是很麻烦的,如果每次写入/读取器被关闭时关闭该流。
我送一个流的方法来写,并在这些方法中我使用的是二进制读取/ wrtier。 当读取器/写入器被设置,或者通过using
或者只是在不引用它,在流关闭以及??
我会派一个BinaryReader在/作家,但我使用一个StreamReader过(也许我应该去解决这一问题。我只使用,对于函数getline和readline)。 这是很麻烦的,如果每次写入/读取器被关闭时关闭该流。
是的, StreamReader
, StreamWriter
, BinaryReader
和BinaryWriter
全部关闭/处置其底层流时,你叫Dispose
他们。 如果读/写器只是垃圾回收虽然他们不处分流的-你应该总是处置读/写器,preferrably有using
说明。 (事实上,所有这些类都有终结,也不应该有。)
我个人更喜欢有一个using语句流为好。 您可以嵌套using
语句没有括号很整齐:
using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}
即使using
语句流是有些多余的(除非StreamReader
构造函数抛出异常),我认为这是最好的做法是那么如果你摆脱了StreamReader
,只是直接使用流在以后的日子,你已经有正确处理语义。
这是一个古老的一个,但我想今天做类似的事情,发现一切都变了。 由于.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) {
}
如果其中的一些违约的暴露这将是很好,或者如果论据是可选的,所以,我们可以只指定了我们需要的人。
是的,它确实。 您可以通过查看与反射器实施验证这一点。
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);
}
}
}
六年晚,但也许这会帮助别人。
的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...
}
是。 呼吁和IDisposable接口的Dispose()(其中“使用”一样)应该作出对象清理其所有资源。 这包括流冲洗,并关闭其文件描述符。
如果,你的情况,你想把它传递给其他的方法,那么你需要确保这些方法没有做好自己的读/写在使用块。
如果你需要是覆盖的StreamWriter类Dispose方法一个简单的方法来解决这个问题。 请参见我的文章在这里就如何做到这一点的代码:
是否.Disposing一个StreamWriter关闭底层流?
流设置或者通过“使用”关键字或调用dispose明确地