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将産生異常。