2009-06-29 21 views
27

bu C# kodu varsayalım: StreamWriter.flush() yapmam gerekiyor mu?

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

Benim sorulara

şunlardır:

  1. ben düzeni korumak için döngü içine gömme kullanmam gerekir mi?
  2. MemoryStream.ToArray() numaralı ürün iade edilmekte midir? using'u bir toplantı olarak kullanıyorum, korkarım ki bu işin içine karışacaktır.

cevap

24

Önceki cevabı kazıyın - Aynı akışta iki sarmalayıcı kullandığınızı fark etmemiştim. Bu bana biraz riskli geliyor.

Her iki şekilde de StreamWriter ve BinaryWriter'u kendi using bloklarına yerleştirirdim.

MemoryStream numaralı telefondan ToArray() numaralı telefonu aramak yasaldır - veri atıldıktan sonra bile korunmaktadır. Gerçekten iki sarmalayıcılarını kullanmak istiyorsanız

, böyle yapardım:

Söylemek zorunda
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(); 
} 

, olsa aynı akışta yaklaşık iki sarmalayıcılarını kullanmanın biraz dikkatli. Her işlemden sonra, tek bir veriyle bitmediğinizden emin olmak için her birini temizlemeniz gerekir. Sen durumları azaltmak için true StreamWriter 'ın AutoFlush özelliğini ayarlayın olabilir ve şu anda değil aslında kızarma gerektirir (yani herhangi bir veriyi tampon değil) ama bu güvenerek riskli hissediyorBinaryWriter inanıyoruz .

İkili ve metin verilerini karıştırmanız gerekiyorsa, BinaryWriter kullanırım ve Encoding.GetBytes(string) ile getirerek dize için baytları açıkça yazar.

+0

İki akışlı bir yazarla bir akış sarmak tehlikeli/hataya eğilimli gibi görünüyor, ancak bu durumda kızarma olduğunu düşünmüyorum. Flush, MemoryStream öğesinin okumasını etkilemez, yalnızca arabellek baytların ilgili akışlarına yazılmasını etkilemez. – mbillard

+1

Değerlerin yazılabilmesi sırasını etkiler - AutoFlush öğesini true değerine ayarlamazsanız, StreamWriter MemoryStream'e uzun bir süre boyunca hiçbir şey yazamaz (veya atmadığınız takdirde * hiç *). Sadece bana kırılgan geliyor. –

+0

bir şey, ismin sonunda bir satırsonu istiyorum ve WriteLine bunun için güvenli bir yol gibi görünüyor. – Nefzen

0

Güncelleme

Nevermind bu cevap, ben ... yazarlar ile karıştı

  1. Hayır, sipariş korunacaktır

    (güncelleme: belki değil). Flush, ne zaman hatırlayamasam da diğer durumlarda yararlı/gereklidir.
  2. Sanırım kullanarak , her şeyin temizlendiğinden emin oluyor.
+0

İkili yazar ve akarsu yazarı arasında düzenin * korunmuş olması gerektiğini düşünmüyorum - ikili yazara ait bir değerler yükü ve akarsu yazarının bir sonraki tampon değeri. –

+0

1. Sipariş, korunmayacak. 2. Hayır "kullanma" Dispose() 'normalWriter veya binaryWriter değil. – dss539

+0

Her iki yazar da aynı arabelleği paylaşıyor mu? – mbillard

İlgili konular