2010-06-30 4 views
8

में स्ट्रीम रीडर और बफर स्ट्रीमरडर के साथ बफर उपयोग के बारे में मेरा कोई प्रश्न है। यहाँ: http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx आप देख सकते हैं:सी #

"जब एक स्ट्रीम से पढ़ने, यह एक बफर धारा के आंतरिक बफर के रूप में एक ही आकार है कि उपयोग करने के लिए और अधिक कुशल है।"।

इस weblog के अनुसार, एक StreamReader के आंतरिक बफर आकार 2k है, इसलिए मैं कुशलता से कुछ Read(Char[], Int32, Int32) परहेज Read() का उपयोग कर केबीएस की एक फ़ाइल पढ़ सकते हैं।

इसके अलावा, भले ही एक फ़ाइल बड़ा है मैं StreamReader buffer

के लिए एक आकार गुजर तो एक बाहरी बफर की जरूरत क्या है का निर्माण कर सकते हैं?

उत्तर

1

मुझे लगता है कि इस सवाल का पहले से ही stackoverflow पर किसी भी तरह अलग ढंग से कहा गया था: How to write the content of one stream into another stream in .net?

"पढ़ें विधि का उपयोग करते हैं, यह एक बफर धारा के आंतरिक बफर है, जहां के रूप में एक ही आकार है कि उपयोग करने के लिए और अधिक कुशल है आंतरिक बफर आपके वांछित ब्लॉक आकार पर सेट होता है, और हमेशा ब्लॉक आकार से कम पढ़ने के लिए। यदि स्ट्रीम का निर्माण होने पर आंतरिक बफर का आकार निर्दिष्ट नहीं किया गया था, तो इसका डिफ़ॉल्ट आकार 4 किलोबाइट (4096 बाइट्स) है। "

4

StreamReader.Read विधियों के कार्यान्वयन को देखते हुए, आप देख सकते हैं कि वे दोनों आंतरिक ReadBuffer विधि को कॉल करते हैं।

Read() विधि पहले आंतरिक बफर में पढ़ता है, फिर बफर पर एक-एक करके आगे बढ़ता है।

public override int Read() 
{ 
    if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0)) 
    { 
     return -1; 
    } 
    int num = this.charBuffer[this.charPos]; 
    this.charPos++; 
    return num; 
}

Read(char[]...)ReadBuffer भी कहता है, लेकिन बजाय फोन करने वाले द्वारा प्रदान की बाहरी बफर में:

public override int Read([In, Out] char[] buffer, int index, int count) 
{ 
    while (count > 0) 
    { 
     ... 
     num2 = this.ReadBuffer(buffer, index + num, count, out readToUserBuffer); 
     ... 
     count -= num2; 
    } 
}

तो मैं केवल प्रदर्शन नुकसान लगता है कि आप Read(char[]) और से Read() और अधिक बार कॉल करने की आवश्यकता है क्योंकि यह एक वर्चुअल विधि है, कॉल स्वयं इसे धीमा कर देते हैं।