2008-09-24 5 views
39

मैं अक्सर समस्या में भाग लेता हूं कि मेरे पास डेटा से भरा एक धारा है और इसे सब कुछ दूसरी स्ट्रीम में लिखना है।एक स्ट्रीम की सामग्री को .NET में किसी अन्य स्ट्रीम में कैसे लिखें?

वहां सभी कोड-उदाहरण बाइट-सरणी के रूप में एक बफर का उपयोग करते हैं।

क्या इसका कोई और शानदार तरीका है?

यदि नहीं, तो बफर का आदर्श आकार क्या है। कौन सा कारक इस मूल्य को बनाते हैं?

उत्तर

16
आदर्श बफर आकार के बारे में

:

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

कोई भी स्ट्रीम-रीडिंग प्रक्रिया रीड (चार बफर [], इंट इंडेक्स, गिनती) का उपयोग करेगी, जो इस उद्धरण को संदर्भित करती है।

http://msdn.microsoft.com/en-us/library/9kstw824.aspx ("टिप्पणियां" के तहत)।

7

में जाने के लिए मुझे यकीन है कि नहीं कर रहा हूँ कुछ दिशा-निर्देश होगा यदि आप कर सकते हैं सीधे पाइप एक .NET में एक और करने के लिए धारा, लेकिन यहाँ एक मध्यवर्ती बाइट के साथ यह करने के लिए एक विधि है बफर। बफर का आकार मनमाने ढंग से है। सबसे कुशल आकार इस बात पर निर्भर करेगा कि आप कितना डेटा ट्रांसफर कर रहे हैं।

static void CopyStream(Stream input, Stream output){ 
    byte[] buffer = new byte[0x1000]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     output.Write(buffer, 0, read); 
} 
+1

आप static void CopyTo (इस स्ट्रीम इनपुट, स्ट्रीम उत्पादन) की तरह कुछ के रूप में में एक विस्तार विधि सी # 3.0 के रूप में यह लागू कर सकता है, और है यह ... –

2

मुझे बफर का उपयोग करने से अधिक सुंदर तरीके से अवगत नहीं है।

लेकिन एक बफर का आकार एक अंतर बना सकता है। Vista की फ़ाइल प्रतिलिपि के बारे में समस्याएं याद रखें? इसका कारण बफर आकार बदल रहा था (मूल रूप से)। परिवर्तन this blogpost में समझाए गए हैं। आप उस पोस्ट के मुख्य कारकों को सीख सकते हैं। हालांकि, यह केवल फ़ाइल प्रतिलिपि के लिए लागू होता है। अनुप्रयोगों में शायद आप बहुत सारी मेमोरी प्रतियां करते हैं, इसलिए उस मामले में, 4 केबी सबसे अच्छा बफर आकार, as recommended by the .NET documentation हो सकता है।

68

.NET 4.0 में हमें अंततः Stream.CopyTo विधि मिली! वाह!

+4

यह वास्तव में यह है ! –

+2

मैं Stream.CopyTo विधि में decompiled और यह "यह। आंतरिक कॉपीराइट (गंतव्य, 81920) के लिए एक कॉल करता है;" पूर्णांक मान बफर आकार है। मानक 4k की तुलना में पागल बफर आकार की तरह लगता है कि अधिकांश बफरिंग तकनीकें नियोजित लगती हैं। क्या कोई इस पर टिप्पणी कर सकता है? – ctrlplusb

+2

ऐसा लगता है कि वह संख्या केवल बड़े ऑब्जेक्ट ढेर का उपयोग करने से बचने की कोशिश कर रही है, जो उस राशि के थोड़ा उत्तर में लात मार जाएगी। –

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

  • कोई संबंधित समस्या नहीं^_^