2011-03-02 43 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更清洁。
相关问题