将Stream和StringBuilder输出到文件

17

我需要创建一个大型文本文档。目前我使用 StringBuilder 制作文档,然后调用 File.WriteallText(filename,sb.ToString)。不幸的是,这开始抛出内存不足异常。

是否有更好的方法将 StringBuilder 流式写入文件,或者我应该使用其他技术?


1
你可不可以直接使用File.WriteAllText并添加文本,而不是将其放入StringBuilder中一次性完成? - Bali C
3
要调用WriteAllText函数,你需要拥有所有的文本,因此这并不能解决内存问题。 - Marc Gravell
4个回答

23

不要使用 StringBuilder,尝试使用 TextWriter(它具有类似的API,但可以写入到多个底层目标,包括文件)- 例如:

using(TextWriter writer = File.CreateText(path))
{
    // loop etc
    writer.Write(...);
}

更一般地说,值得将知道文件的代码与知道如何写入数据的代码分开,也就是说。

using(var writer = File.CreateText(path))
{
    Serialize(writer);
}
...
void Serialize(TextWriter writer)
{
    ...
}

这使得编写到不同目标的操作更加容易。例如,现在您可以在内存中进行操作:

var sw = new StringWriter();
Serialize(sw);
string text = sw.ToString();

要点是:你的 Serialize 代码没有改变来适应不同的目标。这也可以直接写入网络,或通过压缩/加密流进行写入。非常灵活。


5
只需使用写入到FileStream的StreamWriter:
using (StreamWriter writer = new StreamWriter("filename.txt")) {
  ...
}

这当然意味着您不能像在 StringBuilder 中那样更改已经编写的文本,但我假设您也不会使用它。


1
为什么要点踩?如果你不解释哪里有问题,那么回答就无法得到改进。 - Guffa

1

为什么不直接将流传递到流中呢? 您可以使用TextWriter


0
你可以使用 StreamWriter 直接向文件中写入内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接