我需要创建一个大型文本文档。我目前使用StringBuilder
制作文档,然后调用File.WriteallText(filename,sb.ToString)
。不幸的是,这现在开始抛出内存异常。
有没有更好的方法将StringBuilder
流式传输到文件,还是我应该使用其他技术?
答案 0 :(得分:21)
不要使用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
代码无需更改即可容纳不同的目标。这也可以直接写入网络,或通过压缩/加密流写入。非常多才多艺。
答案 1 :(得分:5)
只需使用写入StreamWriter
的{{1}}:
FileStream
这当然意味着您无法更改已经写入的文本,就像您在using (StreamWriter writer = new StreamWriter("filename.txt")) {
...
}
中所做的那样,但我认为您还没有使用它。
答案 2 :(得分:1)
为什么不直接流式传输到流中? 您可以使用TextWriter。
答案 3 :(得分:0)
您可以使用StreamWriter直接写入文件。