2010-02-10 5 views
40

Qual è il metodo migliore per scrivere uno StringBuilder su System.IO.Stream?Scrivi StringBuilder per lo streaming

Attualmente sto facendo:

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

risposta

62

Non utilizzare uno StringBuilder, se si sta scrivendo a un ruscello, fare proprio questo con un 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(...); 
} 
+6

Non è possibile se ha bisogno di usare la stringa per qualcos'altro prima di scriverlo però. – Skurmedel

+10

Assolutamente vero, ma ovviamente non ha detto che è un requisito, quindi non ho fatto alcuna ipotesi. –

12

che è il migliore metodo. Altra perdita saggio lo StringBuilder e usare qualcosa come segue:

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

A seconda del caso d'uso può anche avere senso per iniziare solo con uno 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 
+1

Abbastanza sicuro: https://msdn.microsoft.com/en-us/library/system.io.stringwriter.getstringbuilder(v=vs.110).aspx –

4

Forse sarà utile.

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 
+2

Copia prima in una stringa, quindi copia nuovamente in una matrice di byte , quindi copiare finalmente nello stream? Veramente? Sicuramente questo può essere fatto succintamente senza fare alcuna copia intermedia. (Cosa succede se il generatore di stringhe è 2 GB?) –

0

Se si desidera utilizzare qualcosa come uno StringBuilder perché è più pulito di passare in giro e lavorare con, allora si può usare qualcosa come il seguente alternativo StringBuilder ho creato.

La cosa più importante è che consente di accedere ai dati interni senza doverli assemblare prima in una stringa o in un ByteArray. Ciò significa che non è necessario raddoppiare i requisiti di memoria e rischiare di tentare di allocare un blocco contiguo di memoria che si adatta all'intero oggetto.

NOTA: Sono sicuro che ci sono opzioni migliori quindi utilizzando un List<string>() internamente, ma questo era semplice e si è dimostrato essere abbastanza buono per i miei scopi.

Ora è possibile scaricare l'intero contenuto in un file utilizzando il seguente codice.

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

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