2010-11-11 49 views
0

嗨,流寫入器的基本理解

我的問題與使用StreamWriter寫入數據的基本理解有關。 如果考慮下面的代碼:

  StreamWriter writer = new StreamWriter(@"C:\TEST.XML"); 
      writer.WriteLine("somestring"); 
      writer.Flush(); 
      writer.Close(); 

當作家對象初始化,與文件名,所有它是一個指向該文件。

但是,當我們向編寫器對象寫入任何字符串時,它是否實際加載整個文件,讀取其內容,將字符串追加到末尾,然後關閉句柄?

我希望它不是一個愚蠢的問題。 我問這是因爲我遇到了一個應用程序,它可能會每半秒鐘對一個文件進行頻繁寫入,並且文件大小增加到大約1 GB,並且它仍然繼續寫入文件。 (日誌記錄)

您是否認爲這可能導致CPU使用率爲100%?

如果我的問題不清楚,請讓我知道嗎?

在此先感謝。

+0

除非有很多線程試圖寫入同一文件否,否則不會導致100%的CPU使用率。 – 2010-11-11 23:30:00

+0

即使它正在加載整個文件,我不會期望100%的CPU使用率,因爲我認爲它是IO限制的 – 2010-11-11 23:41:56

回答

3

它實際上加載整個文件,框架打開文件後讀取其內容

,它會執行一個FileStream.Seek操作將文件指針定位到文件的末尾。這由操作系統支持,並且不需要讀取或寫入任何文件數據。

,然後關閉手柄

關閉句柄,當你調用CloseDispose。兩者都是相同的。 (注意:爲了方便起見,你可以充分利用C#using statement創建哪裏Dispose呼叫由編譯器在退出範圍處理的範圍。)

每半秒鐘一個文件

這聽起來不夠頻繁,無法以100%加載機器。特別是由於磁盤I/O主要由等待磁盤組成,並且這種等待不會影響CPU使用率。使用分析器查看您的應用程序在哪裏花費時間。或者,您可以嘗試的簡單技術是在調試器下運行,單擊暫停,然後檢查線程的調用堆棧。當您隨機暫停應用程序時,很有可能會耗費大量時間的方法在堆棧中。

0

您在上面提供的代碼將覆蓋文件的內容,因此它不需要預先加載文件。
儘管如此,你可以這樣附加到文件:

StreamWriter writer = new StreamWriter(@"C:\TEST.XML", true); 

true參數是告訴它附加到文件中。
而且它仍然在內存中加載它之前並不加載整個文件。
這就是所謂的「流」,這意味着如果你走的是一條路,那麼你就走一條路。