2008-09-24 2 views
5

में डेटा पढ़ें किसी अन्य स्ट्रीम में स्ट्रीम पढ़ने का सबसे प्रभावी तरीका क्या है? इस मामले में, मैं एक जेनेरिक स्ट्रीम में एक फिलस्ट्रीम में डेटा पढ़ने की कोशिश कर रहा हूं। मैं जानता हूँ कि मैं निम्नलिखित कर सकता है: लाइन द्वारा
1. पढ़ने लाइन और
2. बाइट्स की पढ़ने हिस्सा धारा पर डेटा लिखने और स्ट्रीम में लिखें
3. आदिफ़ाइल स्ट्रीम में एक सामान्य स्ट्रीम

मैं सिर्फ कोशिश कर रहा हूँ सबसे कुशल तरीका खोजने के लिए।

धन्यवाद

+0

कुशलता से आपका क्या मतलब है? वह सबसे तेज़ था, कम से कम स्मृति का उपयोग करता है, या कुछ अन्य मानदंडों का उपयोग करता है? –

उत्तर

7

स्टीफन टब अपने एमएसडीएन .NET मामलों कॉलम here में एक स्ट्रीम पाइपलाइन पर चर्चा करता है। लेख में वह एक CopyStream() विधि का वर्णन करता है जो एक इनपुट स्ट्रीम से दूसरी स्ट्रीम में प्रतिलिपि बनाता है। यह वही लगता है जो आप करने की कोशिश कर रहे हैं।

+0

मुझे समानांतर कार्य परिप्रेक्ष्य के लिए वास्तव में वह लेख पसंद आया, लेकिन वह स्ट्रीम कॉपी अपने आप में बहुत उपयोगी है। हालांकि, यदि धारा लंबाई संपत्ति का समर्थन करती है (यदि CanSeek झूठी, अपवाद है), बफर इनपुट स्ट्रीम की लंबाई होनी चाहिए और एक ही पढ़ने में किया जाना चाहिए। –

1

बाइट्स की एक बफर पढ़ना और फिर लिख यह सबसे तेज है। ReadLine() जैसे तरीके लाइन डिलीमीटर की तलाश करने की आवश्यकता है, जो केवल बफर भरने से अधिक समय लेता है।

0

मैं सामान्य धारा के द्वारा मान, आप एक मेमोरी स्ट्रीम की तरह धारा के किसी भी अन्य प्रकार, आदि

मतलब हां, तो सबसे कारगर तरीका बाइट्स का हिस्सा पढ़ सकते हैं और उन्हें प्राप्तकर्ता स्ट्रीम में लिखें करने के लिए है। खंड आकार 512 बाइट्स जैसा कुछ हो सकता है।

7

मैं एक साथ लुढ़का एक त्वरित विस्तार विधि (ताकि 2008 डब्ल्यू/3.5 केवल):

public static class StreamCopier 
{ 
    private const long DefaultStreamChunkSize = 0x1000; 

    public static void CopyTo(this Stream from, Stream to) 
    { 
     if (!from.CanRead || !to.CanWrite) 
     { 
     return; 
     } 

     var buffer = from.CanSeek 
     ? new byte[from.Length] 
     : new byte[DefaultStreamChunkSize]; 
     int read; 

     while ((read = from.Read(buffer, 0, buffer.Length)) > 0) 
     { 
     to.Write(buffer, 0, read); 
     } 
    } 
} 

यह इस प्रकार किया जा सकता है:

using (var input = File.OpenRead(@"C:\wrnpc12.txt")) 
using (var output = File.OpenWrite(@"C:\wrnpc12.bak")) 
{ 
    input.CopyTo(output); 
} 

तुम भी तर्क थोड़ा चारों ओर स्वैप कर सकते हैं और CopyFrom() विधि भी लिखें।