[转]C#StreamWriter、StreamReader与FileStream的关闭总结
原文链接:StreamWriter、StreamReader与FileStream的关闭总结——CSDN
StreamReader及StreamWriter类中包含一个私有的Stream,
- 如果你使用public StreamReader(string path)和public StreamWriter(string path);这个构造函数,StreamReader和StreamWriter会主动创建一个FileStream。
- 如果你使用public StreamReader(Stream stream)或public StreamWriter(Stream stream);这个构造函数,StreamReader或StreamWriter则不会再创建FileStream而是直接使用你传入的Stream 。
- 在上述两种情况下,** StreamReader或StreamWriter在Close的时候都会关闭FileStream**。
实例代码:
FileStream fs = new FileStream(@"C:\A.txt" , FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs);
sw.Close( );
fs.Close( );
在 sw.Close( );执行完毕后,其实fs已经被关闭了。因此 fs.Close( );其实是可以省略的。
当然,这样的写法不会有任何问题,因为Dispose不会被执行两次。
但是:
FileStream fs = new FileStream(@"C:\A.txt" , FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs);
fs.Close( );
sw.Close( );
会报错。
原因: sw.Close( ); fs.Close( );
这两行代码不可以交换顺序,如果先执行 fs.Close( );再执行 sw.Close( );将引发异常。
因为在StreamWriter的Close函数调用过程中,将调用Flush函数,而此时fs已经被关闭,Flush将产生异常。