将StringBuilder的内容写入文件而不调用ToString()

时间:2016-02-16 13:14:57

标签: c#

让我们想象一下,我有一个StringBuilder,我无法重构它来使用流。我想将StrinBuilder的内容写入文件,但我不想在内存中制作额外的内容副本,即我不想打电话给ToString()

我可以在不在内存中制作额外副本的情况下获取内容吗?

我相信在版本2 ToString()之前可以通过使用写入时复制来避免复制,但不再是这种情况。

3 个答案:

答案 0 :(得分:5)

如果我正确理解你的问题,那不是要复制本身,而是要立刻复制整件事。换句话说,如果您有一个兆字节StringBuilder,请避免需要多兆字节分配才能将其存储到磁盘。

如果这是正确的,您可以使用StringBuilder.CopyTo和较小的固定大小缓冲区来复制数据块。然后,您可以将这些较小的块直接写入您喜欢的任何流。

答案 1 :(得分:4)

您可以通过索引

访问ToString()的{​​{1}}元素来避免char
StringBuilder

答案 2 :(得分:0)

对于大字符串,一次写入1个字节可能非常慢,因此实现了对StringBuilder.CopyTo(..)的建议:

 using (StreamWriter sw = new StreamWriter(FilePath))
 {
     const int bufferSize = 10000;
     char[] buffer = new char[bufferSize];

     for (int i = 0; i < builder.Length; i += bufferSize)
     {
         int count = Math.Min(bufferSize, builder.Length - i);
         builder.CopyTo(i, buffer, 0, count);
         sw.Write(buffer, 0, count);
     }
 }