2009-12-19 13 views
17

.NET 4 में पेश की गई एक उपयोगी सुविधा Stream.CopyTo(Stream[, Int32]) जो वर्तमान स्ट्रीम से सामग्री को पढ़ती है और इसे दूसरी स्ट्रीम में लिखती है।.NET 4 में Stream.CopyTo (स्ट्रीम) विधि लागू की गई है?

यह थोड़ा कठिन code such as this के लिए की जरूरत है obviates:

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[32768]; 
    while (true) 
    { 
     int read = input.Read (buffer, 0, buffer.Length); 
     if (read <= 0) 
      return; 
     output.Write (buffer, 0, read); 
    } 
} 

जब से मैं नेट 4 इस मशीन पर स्थापित नहीं है, मैं सोच रहा था कि अगर कोई है जो .NET 4 परावर्तक खोल सकता है स्थापित है और हमें दिखाएं कि फ्रेमवर्क क्लास लाइब्रेरी टीम ने .NET 4.

के लिए इस विधि को कैसे कार्यान्वित किया है ऊपर दिए गए कोड स्निपेट के साथ उनके कार्यान्वयन की तुलना करें और इसके विपरीत करें। विशेष रूप से, मुझे यह जानने में दिलचस्पी है कि डिफ़ॉल्ट बफर आकार क्या चुना गया था।

+0

प्रतिलिपि नेटवर्कस्ट्रीम पर काम करता है? – Benny

+0

अच्छा सवाल। निश्चित नहीं है ... शायद .NET 4 स्थापित लोगों में से एक इसे आजमा सकते हैं? –

+0

ऐसा लगता है कि यह नेटवर्कस्ट्रीम पर काम कर सकता है। – Benny

उत्तर

16

.NET 4.5.1 में, यह 81920 बाइट्स के एक निश्चित बफर आकार का उपयोग करता है। (.NET के पहले संस्करणों ने 4096 बाइट्स के एक निश्चित बफर आकार का उपयोग किया था, और इसमें कोई संदेह नहीं होगा कि समय के साथ बदलना जारी रहेगा।) एक अधिभार भी है जहां आप अपना स्वयं का बफर आकार पास कर सकते हैं।

कार्यान्वयन आपके जैसा ही है, मॉड्यूल कुछ घूम रहा है और कुछ त्रुटि जांच रहा है। इस प्रकार परावर्तक यह के दिल प्रस्तुत करता है: (। अब आप http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs#98ac7cf3acb04bb1 पर वास्तविक स्रोत देख सकते हैं)

private void InternalCopyTo(Stream destination, int bufferSize) 
{ 
    int num; 
    byte[] buffer = new byte[bufferSize]; 
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0) 
    { 
    destination.Write(buffer, 0, num); 
    } 
} 

त्रुटि जाँच के आसपास है कि क्या input.CanRead और output.CanWrite दोनों सही हैं मूल रूप से है, या या तो निपटाया गया है। तो बेनी के सवाल के जवाब में यह नेटवर्कस्ट्रीम (या एक लिखने योग्य नेटवर्कस्ट्रीम) से पूरी तरह से खुश होना चाहिए।

+0

मुझे लगता है कि विचार केवल बफर के लिए बिल्कुल 1 पृष्ठ का उपयोग करना है? – Yuliy

+4

यह बफर आकार के लिए "खुश नंबर" है। पेज सीमा पर बिल्कुल गिरना बेहद असंभव है। –

+1

यह भी इतना छोटा है कि बड़े ऑब्जेक्ट ढेर पर आवंटित न किया जाए। – skolima

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