编辑:正如@ramon-smits 指出的那样,如果您可以访问StringBuilder.GetChunks()
,您也可以访问StreamWriter.WriteAsync(StringBuilder)
. 所以你可以这样做:
StringBuilder stringBuilder = new StringBuilder();
// Write data to StringBuilder...
Stream stream = GetStream(); // Get output stream from somewhere.
using (var streamWriter = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true))
{
await streamWriter.WriteAsync(stringBuilder);
}
简单得多。
我最近不得不做这件事,发现这个问题的答案并不令人满意。
您可以将 StringBuilder 写入 Stream 而无需具体化整个字符串:
StringBuilder stringBuilder = new StringBuilder();
// Write data to StringBuilder...
Stream stream = GetStream(); // Get output stream from somewhere.
using (var streamWriter = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true))
{
foreach (ReadOnlyMemory<char> chunk in stringBuilder.GetChunks())
{
await streamWriter.WriteAsync(chunk);
}
}
注意 此 API (StringBuilder.GetChunks()) 仅在 .NET Core 3.0 及更高版本中可用
如果此操作频繁发生,您可以通过使用 StringBuilder 对象池进一步降低 GC 压力。