2009-06-29 23 views
27

Załóżmy ten kod C#:Czy muszę wykonać 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(); 
} 

moje pytania są następujące:

  1. Czy muszę używać równo wewnątrz pętli zachować porządek?
  2. Powraca MemoryStream.ToArray() prawnie? Używam using -blok jako konwencji, obawiam się, że to wszystko zepsuje.

Odpowiedz

24

Zszokuj poprzednią odpowiedź - nie zauważyłem, że używasz dwóch opakowań wokół tego samego strumienia. To wydaje mi się nieco ryzykowne.

Tak czy inaczej, umieściłbym StreamWriter i BinaryWriter we własnych blokach using.

Och, i tak, można zadzwonić pod numer ToArray() pod numerem MemoryStream - dane są przechowywane nawet po ich usunięciu.

Jeśli naprawdę chcesz użyć dwóch owijarki, zrobiłbym to tak:

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

muszę powiedzieć, że jestem dość ostrożny używając dwóch obwoluty wokół tego samego strumienia chociaż. Po każdej operacji będziesz musiał przepłukać każdy z nich, aby upewnić się, że nie skończysz z danymi nieparzystymi. Można ustawić StreamWriter „s AutoFlush własność na true, aby złagodzić sytuację i wierzę że BinaryWriter obecnie nie faktycznie wymaga spłukiwania (to znaczy nie buforować żadnych danych), ale opierając się na tym, czuje się ryzykowne.

Jeśli musisz mieszać dane binarne i tekstowe, użyłbym BinaryWriter i jawnie zapisałbym bajty ciągu, pobierając go za pomocą Encoding.GetBytes(string).

+0

Zawijanie jednego strumienia z dwoma pisarzami strumieniowymi wydaje się być niebezpieczne/podatne na błędy, chociaż nie sądzę, że ich spłukanie spowoduje cokolwiek w tym przypadku. Przepłukanie nie wpływa na odczyt strumienia MemoryStream, tylko zapis buforowanych bajtów w ich strumieniach. – mbillard

+1

Wpływa to na kolejność zapisywania wartości - chyba że ustawisz AutoFlush na wartość true, StreamWriter może nie zapisywać niczego w MemoryStream przez dłuższy czas (lub * kiedykolwiek *, jeśli nie chcesz go usunąć). Dla mnie jest po prostu kruchy. –

+0

Chodzi o to, że potrzebuję nowej linii na końcu nazwy, a WriteLine wydaje się bezpiecznym sposobem na to. – Nefzen

0

Aktualizacja

Nevermind to odpowiedź, mam mylić z pisarzami ...


  1. Nie, zlecenie zostanie zachowany (aktualizacji: może nie). Kolor jest przydatny/potrzebny w innych sytuacjach, ale nie pamiętam kiedy.
  2. Myślę, że tak, używając zapewnia, że ​​wszystko sprząta ładnie.
+0

Nie sądzę, aby kolejność * zostanie * koniecznie zachowana, między pisarzem binarnym a twórcą strumienia - może się skończyć ładowaniem wartości z pisarza binarnego, a następnie wartością następnego bufora strumienia. –

+0

1. Brak zamówienia nie zostanie zachowany. 2. Nie "używanie" nie powoduje "Dispose()" normalWriter lub binaryWriter. – dss539

+0

Obydwaj autorzy mają ten sam bufor? – mbillard

Powiązane problemy