Frage

Was ist die beste Methode, einen Stringbuilder zu einem System.IO.Stream schreiben?

Ich bin derzeit tun:

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);
War es hilfreich?

Lösung

Verwenden Sie einen Stringbuilder nicht, wenn Sie schreiben in einem Stream, genau das zu tun mit einem Stream :

using (var memoryStream = new MemoryStream())
using (var writer = new StreamWriter(memoryStream ))
{
    // Various for loops etc as necessary that will ultimately do this:
    writer.Write(...);
}

Andere Tipps

Das ist die beste Methode. Andere weisen Verlust der Stringbuilder und Verwendung so etwas wie folgt:

using (MemoryStream ms = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(ms, Encoding.Unicode))
    {
        sw.WriteLine("dirty world.");
    }
    //do somthing with ms
}

Vielleicht wird es sehr nützlich.

var sb= new StringBuilder("All your money");
sb.Append(" are belong to us, dude.");
var myString = sb.ToString();
var myByteArray = System.Text.Encoding.UTF8.GetBytes(myString);
var ms = new MemoryStream(myByteArray);
// Do what you need with MemoryStream

Je nach Anwendungsfall kann es auch sinnvoll sein, nur mit einem String zu starten:

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

Wenn Sie so etwas wie ein Stringbuilder verwenden, da es sauberer laufen um und arbeiten mit, dann können Sie so etwas wie die folgenden String verwenden alternative I erstellt.

Das Wichtigste es anders macht, ist, dass sie den Zugang zu den internen Daten ermöglicht, ohne es in einen String oder ByteArray zuerst zu montieren ist. Das heißt, Sie müssen die Speicheranforderungen und Risiko nicht verdoppeln versuchen, einen zusammenhängenden Teil des Speichers zuzuordnen, die Ihr gesamtes Objekt paßt.

. HINWEIS: Ich bin sicher, es gibt bessere Möglichkeiten, um eine List<string>() intern verwenden, aber das war einfach und erwies sich als gut genug für meine Zwecke sein

public class StringBuilderEx
{
    List<string> data = new List<string>();
    public void Append(string input)
    {
        data.Add(input);
    }
    public void AppendLine(string input)
    {
        data.Add(input + "\n");
    }
    public void AppendLine()
    {
        data.Add("\n");
    }

    /// <summary>
    /// Copies all data to a String.
    /// Warning: Will fail with an OutOfMemoryException if the data is too
    /// large to fit into a single contiguous string.
    /// </summary>
    public override string ToString()
    {
        return String.Join("", data);
    }

    /// <summary>
    /// Process Each section of the data in place.   This avoids the
    /// memory pressure of exporting everything to another contiguous
    /// block of memory before processing.
    /// </summary>
    public void ForEach(Action<string> processData)
    {
        foreach (string item in data)
            processData(item);
    }
}

Jetzt können Sie den gesamten Inhalt in Datei-Dump den folgenden Code verwenden.

var stringData = new StringBuilderEx();
stringData.Append("Add lots of data");

using (StreamWriter file = new System.IO.StreamWriter(localFilename))
{
    stringData.ForEach((data) =>
    {
        file.Write(data);
    });
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top