2010-05-21 24 views
11

Qual è la differenza tra l'istanziazione di un oggetto MemoryStream e il memoryStream.Write() metodo per scrivere nello stream e la creazione di istanza di un oggetto con lo streaming e la chiamata streamWriter.Write()?Qual è la differenza tra chiamare Stream.Write e utilizzare StreamWriter?

Si consideri il seguente scenario:

Si dispone di un metodo che accetta un flusso, scrive un valore, e lo restituisce. Il flusso viene letto da un momento successivo, quindi la posizione deve essere ripristinata. Ci sono due modi possibili per farlo (entrambi sembrano funzionare).

// Instantiate a MemoryStream somewhere 
//  - Passed to the following two methods 
MemoryStream memoryStream = new MemoryStream(); 

// Not using a StreamWriter 
private static Stream WriteToStream(Stream stream, string value) 
{ 
    stream.Write(Encoding.Default.GetBytes(value), 0, value.Length); 
    stream.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

// Using a StreamWriter 
private static Stream WriteToStreamWithWriter(Stream stream, string value) 
{ 
    StreamWriter sw = new StreamWriter(stream); 
    sw.Write(value, 0, value.Length); 
    sw.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

Questo è in parte un problema ambito, come io non voglio chiudere il flusso dopo aver scritto ad esso dal momento che sarà letto da un secondo momento. Anche io certamente non voglio eliminarlo, perché questo chiuderà il mio stream. La differenza sembra essere che non usare uno StreamWriter introduce una dipendenza diretta su Encoding.Default, ma non sono sicuro che sia un grosso problema. Qual è la differenza, se del caso?

risposta

12

Con StreamWriter si hanno sovraccarichi di livello superiore che possono scrivere vari tipi nello stream senza preoccuparsi dei dettagli. Per esempio il codice

sw.Write(value, 0, value.Length); 

potrebbe effettivamente essere solo

sw.Write(value); 

Utilizzando la (stringa) di sovraccarico StreamWriter.Write.

1

In termini di array, niente, StreamWriter introduce altri metodi più utili per lavorare con altri tipi.

0

StreamWriter è una superclasse di Stream che implementa un TextWriter per semplificare la gestione del testo. Ma dal momento che è una super classe ha tutti gli stessi metodi oltre a quelli di gestione del testo. Questo è il motivo per cui hai bisogno di Encoding.Default.GetBytes (valore) nel primo esempio e nel secondo no.

+0

StreamWriter discende da TextWriter, non da Stream. Sarebbe corretto dire che StreamWriter è un adattatore tra Stream e TextWriter, invece. – nlaq

Problemi correlati