【问题标题】:Stream StringBuilder to file将 StringBuilder 流式传输到文件
【发布时间】:2011-12-21 22:14:37
【问题描述】:

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

有没有更好的方法将StringBuilder 流式传输到文件,或者我应该使用其他一些技术吗?

【问题讨论】:

  • 你能不能只用你正在添加的文本来做 File.WriteAllText 而不是放入一个字符串构建器并一次完成?
  • @Bali 打电话给WriteAllText 你需要有所有的文字,这样对内存问题没有帮助
  • @MarcGravell 啊,是的,我的错,谢谢 Marc

标签: c# string file streaming stringbuilder


【解决方案1】:

只需使用写入FileStreamStreamWriter

using (StreamWriter writer = new StreamWriter("filename.txt")) {
  ...
}

这当然意味着您无法更改已写入的文本,就像您可以在 StringBuilder 中所做的那样,但我假设您无论如何都不会使用它。

【讨论】:

  • 为什么投反对票?如果你不解释你认为错的地方是什么,它就无法改进答案。
【解决方案2】:

不要使用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 代码不需要更改以适应不同的目标。这也可以是直接写入网络,或通过压缩/加密流写入。用途广泛。

【讨论】:

    【解决方案3】:

    您可以使用 StreamWriter 并直接写入文件。

    【讨论】:

      【解决方案4】:

      为什么不直接流式传输到流中? 你可以使用TextWriter

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-29
        • 2011-08-29
        • 2014-08-07
        • 2012-06-18
        • 2021-11-08
        • 2016-12-29
        • 1970-01-01
        相关资源
        最近更新 更多