我需要创建一个大型文本文档。目前我使用 StringBuilder
制作文档,然后调用 File.WriteallText(filename,sb.ToString)
。不幸的是,这开始抛出内存不足异常。
是否有更好的方法将 StringBuilder
流式写入文件,或者我应该使用其他技术?
我需要创建一个大型文本文档。目前我使用 StringBuilder
制作文档,然后调用 File.WriteallText(filename,sb.ToString)
。不幸的是,这开始抛出内存不足异常。
是否有更好的方法将 StringBuilder
流式写入文件,或者我应该使用其他技术?
不要使用 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
代码没有改变来适应不同的目标。这也可以直接写入网络,或通过压缩/加密流进行写入。非常灵活。
using (StreamWriter writer = new StreamWriter("filename.txt")) {
...
}
这当然意味着您不能像在 StringBuilder
中那样更改已经编写的文本,但我假设您也不会使用它。
WriteAllText
函数,你需要拥有所有的文本,因此这并不能解决内存问题。 - Marc Gravell