2009-06-29 14 views
27

Suppongo che questo codice C#:Devo fare StreamWriter.flush()?

using (MemoryStream stream = new MemoryStream()) 
{ 
    StreamWriter normalWriter = new StreamWriter(stream); 
    BinaryWriter binaryWriter = new BinaryWriter(stream); 

    foreach(...) 
    { 
     binaryWriter.Write(number); 
     normalWriter.WriteLine(name); //<~~ easier to reader afterward. 
    } 

    return MemoryStream.ToArray(); 
} 

Le mie domande sono:

  1. cosa ho bisogno per usare filo all'interno del ciclo di preservare l'ordine?
  2. La restituzione è MemoryStream.ToArray() legale? Io uso il blocco-using come una convenzione, temo che possa rovinare tutto.

risposta

24

Gratta la risposta precedente - Non avevo notato che stavi usando due wrapper attorno allo stesso flusso. Mi sembra alquanto rischioso.

In entrambi i casi, inserisco gli StreamWriter e BinaryWriter nei rispettivi blocchi using.

Oh, e sì, è legale chiamare ToArray() su MemoryStream - i dati vengono conservati anche dopo che è stato eliminato.

Se davvero si vuole utilizzare i due involucri, lo farei in questo modo:

using (MemoryStream stream = new MemoryStream()) 
{ 
    using (StreamWriter normalWriter = new StreamWriter(stream)) 
    using (BinaryWriter binaryWriter = new BinaryWriter(stream)) 
    { 
     foreach(...) 
     { 
      binaryWriter.Write(number); 
      binaryWriter.Flush(); 
      normalWriter.WriteLine(name); //<~~ easier to read afterward. 
      normalWriter.Flush(); 
     } 
    }  
    return MemoryStream.ToArray(); 
} 

devo dire, io sono un po 'diffidenti nei confronti di utilizzare due involucri intorno allo stesso flusso però. Dovrai continuare a lavare ciascuno di essi dopo ogni operazione per assicurarti di non finire con dati dispari. Si potrebbe impostare AutoFlush proprietà s' il StreamWriter su true per mitigare la situazione, e io credo che BinaryWriter attualmente non realtà richiedono risciacquo (vale a dire che non tutti i dati del buffer), ma basandosi su che si sente a rischio.

Se si devono combinare dati binari e di testo, utilizzare uno BinaryWriter e scrivere esplicitamente i byte per la stringa, recuperandolo con Encoding.GetBytes(string).

+0

Il wrapping di un flusso con due stream writer sembra pericoloso/soggetto a errori sebbene non ritenga che il flushing farà nulla in questo caso. Flush non influenza la lettura di MemoryStream, ma solo la scrittura dei byte bufferizzati nei rispettivi stream. – mbillard

+1

Influisce sull'ordine in cui i valori possono essere scritti sebbene - a meno che non si imposti AutoFlush su true, StreamWriter non può scrivere nulla su MemoryStream per un lungo periodo (o * mai * se non lo si dispone). Mi sembra fragile. –

+0

la cosa è, voglio una nuova riga alla fine del nome, e WriteLine sembra il modo sicuro per farlo. – Nefzen

0

Aggiornamento

Nevermind questa risposta, mi sono confuso con gli scrittori ...


  1. No, l'ordine verrà conservato (aggiornamento: forse no). Flush è utile/necessario in altre situazioni, anche se non ricordo quando.
  2. Penso di sì, utilizzando assicura che tutto pulisca bene.
+0

Non penso che l'ordine * sarà * necessariamente * preservato, tra il writer binario e lo stream writer qui - potresti finire con un carico di valori dal writer binario e quindi il valore del buffer successivo dello stream writer. –

+0

1. No, l'ordine non verrà conservato. 2. No 'using' non' Dispose() 'normalWriter o binaryWriter. – dss539

+0

Entrambi i writer condividono lo stesso buffer? – mbillard

Problemi correlati