63 votes

Ecriture d'un StringBuilder dans un Stream

Quelle est la meilleure méthode pour écrire un StringBuilder dans un System.IO.Stream ?

Je suis en train de le faire :

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);

1voto

AnthonyVO Points 531

Si vous voulez utiliser quelque chose comme un StringBuilder parce que c'est plus propre à passer et à travailler, alors vous pouvez utiliser quelque chose comme l'alternatif StringBuilder suivant que j'ai créé.

La différence la plus importante est qu'elle permet d'accéder aux données internes sans avoir à les assembler d'abord dans une chaîne ou un tableau d'octets. Cela signifie que vous n'avez pas à doubler les exigences en matière de mémoire et à risquer d'essayer d'allouer un morceau de mémoire contigu qui correspond à votre objet entier.

NOTE : Je suis sûr qu'il y a de meilleures options que d'utiliser une List<string>() en interne, mais cette solution était simple et s'est avérée suffisante pour mes besoins.

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);
    }
}

Maintenant, vous pouvez vider le contenu entier dans un fichier en utilisant le code suivant.

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

using (StreamWriter file = new System.IO.StreamWriter(localFilename))
{
    stringData.ForEach((data) =>
    {
        file.Write(data);
    });
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X