2009-06-29 19 views
27

इस सी # कोड मान लीजिए:क्या मुझे 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(); 
} 

मेरे प्रश्न हैं:

  1. मैं पाश अंदर फ्लश का उपयोग करने के क्रम बनाए रखने की जरूरत है?
  2. MemoryStream.ToArray() कानूनी लौटा रहा है? मैं एक सम्मेलन के रूप में using -ब्लॉक का उपयोग कर रहा हूं, मुझे डर है कि यह गड़बड़ कर देगा।

उत्तर

24

पिछले उत्तर को स्क्रैच करें - मैंने नहीं देखा था कि आप एक ही स्ट्रीम के चारों ओर दो रैपर का उपयोग कर रहे थे। यह मेरे लिए कुछ जोखिम भरा लगता है।

किसी भी तरह से, मैं अपने using ब्लॉक में StreamWriter और BinaryWriter डाल दूंगा।

ओह, और हां, ToArray() पर MemoryStream पर कॉल करना कानूनी है - डेटा को निपटाने के बाद भी बनाए रखा जाता है।

तुम सच में दो रैपर का उपयोग करना चाहते हैं, तो मैं इसे इस तरह करना चाहते हैं:

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

मुझे कहना है, मैं हालांकि एक ही धारा के आसपास दो रैपर का उपयोग करने का कुछ हद तक सावधान कर रहा हूँ। यह सुनिश्चित करने के लिए कि आप अजीब डेटा के साथ समाप्त नहीं होते हैं, आपको प्रत्येक ऑपरेशन के बाद उनमें से प्रत्येक को फ्लश करना होगा। आप स्थिति को कम करने को सही पर StreamWriter के AutoFlush गुण सेट सकता है, और मेरा मानना ​​है कि कि BinaryWriter वर्तमान में नहीं वास्तव में फ्लशिंग की आवश्यकता होती है (यानी यह किसी भी डेटा बफ़र नहीं होता है), लेकिन यह है कि पर निर्भर जोखिम भरा लगता है।

यदि आपको बाइनरी और टेक्स्ट डेटा मिश्रण करना है, तो मैं BinaryWriter का उपयोग करता हूं और स्ट्रिंग के लिए बाइट्स को स्पष्ट रूप से लिखता हूं, इसे Encoding.GetBytes(string) के साथ लाता हूं।

+0

दो धारा लेखकों के साथ एक स्ट्रीम लपेटना खतरनाक/त्रुटि प्रवण प्रतीत होता है हालांकि मुझे नहीं लगता कि उन्हें फ़्लश करने से इस मामले में कुछ भी किया जाएगा। फ्लश मेमोरीस्ट्रीम के पढ़ने को प्रभावित नहीं करता है, केवल बफर्ड बाइट्स के लेखन को उनके संबंधित धाराओं में लिखता है। – mbillard

+1

यह उस क्रम को प्रभावित करता है जिसमें मान लिखा जा सकता है - जब तक कि आप ऑटोफ्लश को सत्य पर सेट नहीं करते हैं, स्ट्रीमवाइटर लंबे समय तक मेमोरीस्ट्रीम में कुछ भी नहीं लिख सकता है (या * कभी * यदि आप इसका निपटान नहीं करते हैं)। यह सिर्फ मुझे भंगुर लगता है। –

+0

बात यह है कि, मैं नाम के अंत में एक नई लाइन चाहता हूं, और लिखितलाइन ऐसा करने का सुरक्षित तरीका प्रतीत होता है। – Nefzen

0

अद्यतन

कोई बात नहीं इस जवाब, मैं लेखकों के साथ भ्रमित हो गया ...


  1. नहीं, आदेश संरक्षित किया जाएगा (अद्यतन: शायद नहीं)। अन्य स्थितियों में फ्लश उपयोगी/आवश्यक है, हालांकि मुझे याद नहीं है।
  2. मुझे ऐसा लगता है, का उपयोग करके सुनिश्चित करें कि सबकुछ अच्छी तरह से साफ हो जाए।
+0

मुझे नहीं लगता कि ऑर्डर * आवश्यक रूप से बाइनरी लेखक और स्ट्रीम लेखक के बीच संरक्षित किया जाएगा - आप द्विआधारी लेखक से मूल्यों के लोड और फिर अगले बफर के स्ट्रीम लेखक के मूल्य के साथ समाप्त हो सकते हैं। –

+0

1. कोई आदेश संरक्षित नहीं किया जाएगा। 2. नहीं 'उपयोग' नहीं 'निपटाना() 'सामान्य लेखक या बाइनरीवाइटर नहीं है। – dss539

+0

दोनों लेखक एक ही बफर साझा करते हैं? – mbillard

संबंधित मुद्दे