61

StringBuilder を System.IO.Stream に書き込む最良の方法は何ですか?

私は現在やっています:

StringBuilder message = new StringBuilder("All your base");
message.Append(" are belong to us");

System.IO.MemoryStream stream = new System.IO.MemoryStream();
System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
stream.Write(encoder.GetBytes(message.ToString()), 0, message.Length);
4

6 に答える 6

92

StringBuilder を使用しないでください。ストリームに書き込む場合は、StreamWriterを使用してください。

using (var memoryStream = new MemoryStream())
using (var writer = new StreamWriter(memoryStream ))
{
    // Various for loops etc as necessary that will ultimately do this:
    writer.Write(...);
}
于 2010-02-10T11:38:45.970 に答える
18

それが最善の方法です。それ以外の場合は、StringBuilder を失い、次のようなものを使用します。

using (MemoryStream ms = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(ms, Encoding.Unicode))
    {
        sw.WriteLine("dirty world.");
    }
    //do somthing with ms
}
于 2010-02-10T11:39:25.843 に答える
5

ユースケースによっては、StringWriter から始めるのも理にかなっている場合があります。

StringBuilder sb = null;

// StringWriter - a TextWriter backed by a StringBuilder
using (var writer = new StringWriter())
{
    writer.WriteLine("Blah");
    . . .
    sb = writer.GetStringBuilder(); // Get the backing StringBuilder out
}

// Do whatever you want with the StringBuilder
于 2013-05-22T23:39:12.600 に答える
2

編集: @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 の負荷をさらに軽減できます。

于 2020-10-22T15:19:18.920 に答える