让我们想象一下,我有一个StringBuilder
,我无法重构它来使用流。我想将StrinBuilder
的内容写入文件,但我不想在内存中制作额外的内容副本,即我不想打电话给ToString()
。
我可以在不在内存中制作额外副本的情况下获取内容吗?
我相信在版本2 ToString()之前可以通过使用写入时复制来避免复制,但不再是这种情况。
答案 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);
}
}