天天看點

StreamWriter、StreamReader與FileStream的關閉總結

StreamReader及StreamWriter類中包含一個私有的Stream,

1)如果你使用public StreamReader(string path)和public StreamWriter(string path);這個構造函數,StreamReader和StreamWriter會主動建立一個FileStream

2)如果你使用public StreamReader(Stream stream)或public StreamWriter(Stream stream);這個構造函數,StreamReader或StreamWriter則不會再建立FileStream而是直接使用你傳入的Stream 。

3)在上述兩種情況下,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将産生異常。

繼續閱讀