2011-05-06 82 views
2

我有以下代碼來讀取和寫入單行到文本文件。我們可以在處理結束時爲讀者和寫者對象賦予null嗎?或者我應該調用Close()方法?謝謝。關閉FileStream並將其設置爲空有什麼區別?

FileInfo JFile = new FileInfo(@"C:\test.txt"); 
      using (FileStream JStream = JFile.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
      { 
       StreamReader reader = null; 
       StreamWriter writer = null; 
       try 
       { 
        int n; 
        reader = new StreamReader(JStream); 
        string line = reader.ReadLine(); 
        int.TryParse(line, out n); 

        n = n + 1; 

        writer = new StreamWriter(JStream); 
        JStream.Seek(0, SeekOrigin.Begin); 
        writer.WriteLine(n); 
        writer.Flush(); 
       } 
       catch (Exception x) 
       { 
        string message = string.Format("Error while processing the file. {0}", x.Message); 
        System.Windows.Forms.MessageBox.Show(message); 
       } 

       reader = null; 
       writer = null; 
      } 
+0

感謝每一個人的偉大的解釋。我使用相同的FileStream對象來創建StreamReader和StreamWriter。如果我在reader和writer對象上調用Close()方法,當它到達writer.Close()時,我會收到一條錯誤消息「無法訪問已關閉的文件」。我猜,因爲reader.Close()已經關閉了閱讀器流和底層文件流。我無法爲讀寫器創建不同的流,因爲我必須鎖定文件,直到完成寫入文件。 – Jyina 2011-05-06 18:15:44

+0

任何想法在這種情況下做什麼?謝謝。 – Jyina 2011-05-06 18:18:54

回答

1

無論是StreamReaderStreamWriter實施IDisposable,這是他們說

的方式「當你與我做的,請調用此方法(Dispose()),所以我知道你跟我做,我可以清理自己「。

(這也被稱爲確定性終結

所以你需要調用這些Dispose,或在using聲明,只是做同樣的事情,你包起來。在這兩個類別的情況下,如果Dispose尚未關閉,它們將在內部呼叫Close

4

關閉文件時需要執行某些操作。例如,當你的程序訪問一個文件,並在其上創建一個handle。流允許框架立即釋放句柄和其他類似的資源。

當你將它設置爲null,你是依靠垃圾收集器爲你做這個重要的功能。 GC可能會將其全部清理乾淨,否則可能不會。你不知道什麼時候會發生。如果你的程序崩潰了,它可能永遠不會釋放句柄。

它總是一個好主意,.Close()一旦大功告成流自己。

+0

對發生了什麼事的很好的解釋。 – light 2011-05-06 17:56:56

1

你真的想調用Close()或更好的Dispose(),以確保所有的內容都被刷新。如果您沒有明確關閉/處置Writer,則可能會導致無法寫入緩衝區。

2

當您設置的對象爲null,你告訴你不再需要它的CLR,並定於垃圾收集。您將遇到的問題是CLR掛鉤到您打開的文件中,直到程序結束並關閉CLR時纔會釋放它。當你調用Close()方法時,文件資源被清理,然後所有的碎片和碎片都被正確地安排在垃圾收集中。

如果你在一個使用塊中打開streamreader,它也會照顧你,但是你會丟失一些try/catch/finally塊得到的細粒度錯誤處理。

1

我認爲最好的解決辦法是使用using statment(就像你在FileStream所做的那樣)。 它會照顧所有的清潔工作。