2011-03-02 67 views
3

我現在正在處理的程序必須生成一個文件。首先生成文件內容爲字符串,然後將該字符串寫入文件,還是應該直接將內容添加到文件中?我應該先建立一個字符串然後寫入文件嗎?

相對於另一個有什麼優勢嗎?

該文件的大小約爲0.5-1MB。

+0

你是什麼意思「生成文件的內容作爲一個字符串」? – Rahul 2011-03-02 15:41:26

+0

基本上,我有一個巨大的字典,必須被翻譯成一個特定格式的文件,大部分硬編碼。所以,我想知道是否應該隨時寫入文件,或者首先將所有內容寫入到字符串構建器中,然後在我成爲圓頂時將此構建器寫入文件中 – xbonez 2011-03-02 16:11:17

回答

9

如果您將文件寫入即時文件,您將獲得不將所有內容都保存在內存中的好處,如果文件足夠大並且不斷刷新流。

但是,你會更容易遇到部分寫入文件的問題,因爲你在一段時間內完成IO而不是一次性完成。

就我個人而言,我會使用StringBuilder進行構建,然後將它全部寫入磁盤中。

+3

如果部分寫入的文件存在問題,寫入臨時文件,然後在文件準備就緒時將其移至預定位置。這樣你就可以得到兩個好處;不在內存中存儲太多,同時確保生成的文件一致。 – 2011-03-02 15:45:17

+1

作爲一個單一的寫作**可以**仍然給你一個部分寫入的文件,所以它不應該是一個不增量寫入的理由。 – 2011-03-02 15:47:36

+0

@Fredrik - 真的,我喜歡這一點,雖然我會將它與StringBuilder結合使用,由於錯誤處理,這會引發@Rowland - 也是如此,但1)您的機會較低,並且2)您的錯誤處理該場景可以在一個地方。 – jvenema 2011-03-02 15:52:15

-1

我認爲最好使用字符串或stringbuilder來存儲數據,然後使用File.Write函數寫入文件。

+1

您可能想要支持該聲明... – 2011-03-02 16:05:49

2

我認爲這是一個更好的主意,一般來說,創建一個StreamWriter並寫入它。當你不需要時,爲什麼要記住事情呢?而且這是一件容易的事情。例如:

using (var writer = new StreamWriter("filename")) 
{ 
    writer.WriteLine(header); 
    // write all your data with Write and WriteLine, 
    // taking advantage of composite formatting 
} 

如果你想建立多行與StringBuilder你必須寫一樣的東西:

var sb = new StringBuilder(); 
sb.AppendLine(string.Format("{0:N0} blocks read", blocksRead)); 
// etc., etc. 
// and finally write it to file 
File.WriteAllText("filename", sb.ToString()); 

還有其他的選擇,當然。您可以將這些線條製作成List<string>,然後使用File.WriteAllLines。或者,您可以寫入StringStream,然後將其寫入文件。但是所有這些方法都讓您多次處理數據。只需打開StreamWriter並撰寫。

主要的原因,我認爲這是在一般一個更好的主意直接去輸出:

  • 你沒有事實證明的時候,你的輸出數據量太大,以適應重構你的代碼記憶。
  • 無論如何,計劃的目的地是文件,那麼爲什麼在寫入文件之前將其格式化爲內存呢?
  • 在我看來,將多行寫入文本文件的API比用於將行添加到StringBuilder的API更清潔。
相關問題