EDIT : Comme le fait remarquer @ramon-smits, si vous avez accès à StringBuilder.GetChunks()
Vous aurez également accès à StreamWriter.WriteAsync(StringBuilder)
. Vous pouvez donc faire ceci à la place :
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);
}
Beaucoup plus simple.
J'ai récemment dû faire exactement la même chose et j'ai trouvé cette question avec des réponses insatisfaisantes.
Vous pouvez écrire un StringBuilder dans un Stream sans matérialiser la chaîne entière :
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);
}
}
N.B. Cette API (StringBuilder.GetChunks()) n'est disponible qu'en .NET Core 3.0 et plus.
Si cette opération est fréquente, vous pouvez encore réduire la pression de la GC en utilisant un pool d'objets StringBuilder.