C # स्ट्रीम का उपयोग करना


116

मेरे लिए धाराएँ रहस्यमयी हैं। मुझे नहीं पता कि कब कौन सी धारा का उपयोग करना है और कैसे उनका उपयोग करना है। क्या कोई मुझे समझा सकता है कि धाराओं का उपयोग कैसे किया जाता है?

अगर मैं सही ढंग से समझूं, तो तीन स्ट्रीम हैं:

  • stream
  • read stream
  • write stream

क्या ये सही है? और, उदाहरण के लिए, a Memorystreamऔर a के बीच क्या अंतर है FileStream?



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

जवाबों:


80

एक स्ट्रीम एक ऑब्जेक्ट है जिसका उपयोग डेटा ट्रांसफर करने के लिए किया जाता है। एक जेनेरिक स्ट्रीम क्लास है System.IO.Stream, जिसमें से .NET की अन्य सभी स्ट्रीम क्लास ली गई हैं। Streamवर्ग बाइट्स से संबंधित है।

कंक्रीट स्ट्रीम कक्षाएं बाइट्स की तुलना में अन्य प्रकार के डेटा से निपटने के लिए उपयोग की जाती हैं। उदाहरण के लिए:

  • FileStreamवर्ग जब बाहर स्रोत एक फाइल है प्रयोग किया जाता है
  • MemoryStream मेमोरी में डेटा स्टोर करने के लिए उपयोग किया जाता है
  • System.Net.Sockets.NetworkStream नेटवर्क डेटा संभालता है

पाठक / लेखक धाराएँ जैसे StreamReaderऔर StreamWriterधाराएँ नहीं हैं - वे व्युत्पन्न नहीं हैं System.IO.Stream, वे डेटा को लिखने और पढ़ने और स्ट्रीम करने में मदद करने के लिए डिज़ाइन किए गए हैं!


3
इसलिए, अगर मैं सही तरीके से समझूं, तो स्ट्रीम में डेटा होता है और इसके साथ कुछ भी नहीं किया जाता है। पाठक और लेखक 'सहायक' वर्ग धारा के भीतर डेटा को संभाल (हेरफेर) कर सकते हैं?
Martijn

9
नहीं, स्ट्रीम डेटा कंटेनर नहीं है, यह डेटा स्थानांतरित करने के लिए उपयोग कर रहा है, उदाहरण के लिए फाइलस्ट्रीम बाइट से डेटा स्थानांतरित करता है [] फिशिकल फ़ाइल के लिए, नेटवर्कस्ट्रीम ट्रांसफर बाइट [] सॉकेट द्वारा। पाठक लेखक कक्षाएं स्ट्रीम से लिखने और पढ़ने के लिए सहायक वर्ग हैं, उदाहरण के लिए स्ट्रीमरडर का उपयोग स्ट्रीम स्ट्रिंग बाइट [] से पढ़ने के लिए किया जा सकता है। यदि आप फ़ाइलस्ट्रीम को एक पैरामीटर के रूप में देंगे, तो यह फाइल से पढ़ेगा, यदि सॉकेट से NetworkStream।
आर्सेन मर्कचियन

इसके अतिरिक्त, स्ट्रीमराइडर और स्ट्रीमव्रीटर पाठ (चरित्र) धाराओं को पढ़ने और लिखने के लिए हैं।
1c1cle

1
मेमोरीस्ट्रीम को समझने में आपकी मदद करने के लिए एक अच्छा लेख है। codeproject.com/Articles/832387/…
जियाजी ली

2
@ user420667। अच्छा प्रश्न। ऑडियोस्ट्रीम और टेम्परेचर दोनों मामलों में, वे सबसे अधिक संभावना है कि डिवाइस के साथ जुड़े ड्राइवर को बाइनरीस्ट्रीम होगा। या, आप एक CustomStream बना सकते हैं जो विशेष रूप से इंटरफ़ेस के लिए बनाया गया है।
सी। 1

62

यहां अन्य उत्तरों पर थोड़ा विस्तार करने के लिए, और बहुत से उदाहरण कोड के बारे में बताने में मदद करें, जिनके बारे में आप बहुत बार देख चुके हैं, अधिकांश समय आप किसी स्ट्रीम में सीधे नहीं पढ़ते और लिखते हैं। डेटा को स्थानांतरित करने के लिए स्ट्रीम निम्न-स्तरीय साधन हैं।

आप देखेंगे कि पढ़ने और लिखने के कार्य सभी बाइट ओरिएंटेड हैं, जैसे राइटबाइट ()। पूर्णांक, तार आदि के साथ काम करने के लिए कोई कार्य नहीं हैं। यह धारा को बहुत सामान्य-उद्देश्य बनाता है, लेकिन अगर आप कहें तो पाठ को स्थानांतरित करना चाहते हैं।

हालाँकि, .NET उन कक्षाओं को प्रदान करता है जो मूल प्रकार और निम्न-स्तरीय स्ट्रीम इंटरफ़ेस के बीच परिवर्तित होते हैं, और डेटा को आपके लिए स्ट्रीम से या में स्थानांतरित करते हैं। कुछ उल्लेखनीय ऐसी कक्षाएं हैं:

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader

इनका उपयोग करने के लिए, पहले आप अपनी स्ट्रीम का अधिग्रहण करते हैं, फिर आप उपरोक्त वर्गों में से एक बनाते हैं और इसे स्ट्रीम के साथ जोड़ते हैं। उदाहरण के लिए

MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);

StreamReader और StreamWriter मूल प्रकारों और उनके स्ट्रिंग अभ्यावेदन के बीच परिवर्तित होते हैं और फिर स्ट्रिंग को बाइट्स के रूप में स्ट्रीम से और स्थानांतरित करते हैं। इसलिए

myStreamWriter.Write(123);

धारा में "123" (तीन अक्षर '1', '2' तो '3') लिखेंगे। यदि आप पाठ फ़ाइलों (उदाहरण के लिए html) के साथ काम कर रहे हैं, तो StreamReader और StreamWriter वे कक्षाएं हैं जिनका आप उपयोग करेंगे।

जहाँ तक

myBinaryWriter.Write(123);

32-बिट पूर्णांक मान 123 (0x7B, 0x00, 0x00, 0x00) का प्रतिनिधित्व करने वाले चार बाइट्स लिखेंगे। यदि आप बाइनरी फ़ाइलों या नेटवर्क प्रोटोकॉल के साथ काम कर रहे हैं तो बाइनरी राइडर और बाइनरीविटर आपके द्वारा उपयोग किए जा सकते हैं। (यदि आप नेटवर्क या अन्य प्रणालियों के साथ डेटा का आदान-प्रदान कर रहे हैं, तो आपको धीरज रखने की आवश्यकता है , लेकिन यह एक और पोस्ट है।)


StreamWriter और रीडर एडॉप्टर क्लासेस को गंभीरता से नाम दिया गया है। उस उल्लेख के लिए धन्यवाद। वे इस नाम के साथ कैसे आए, अभी भी मेरे लिए आश्चर्य की बात है।
तारिक

इसके अलावा, यहां तक ​​कि द्विआधारी लेखक और पाठक वर्ग भी बुरी तरह से नामित हैं।
तारिक

22

बड़ी मात्रा में डेटा से निपटने के लिए धाराएँ अच्छी हैं। जब एक ही समय में सभी डेटा को मेमोरी में लोड करना अव्यावहारिक होता है, तो आप इसे एक स्ट्रीम के रूप में खोल सकते हैं और इसके छोटे हिस्से के साथ काम कर सकते हैं।


1
एक उदाहरण देखना पसंद करेंगे कि आपने अभी क्या कहा है "इसके छोटे हिस्से के साथ काम करें"।
जेन्ना लीफ

2
छोटी मात्रा में डेटा के लिए भी धाराएँ अच्छी हैं। यदि कोई C # प्रोग्रामर किसी फ़ाइल की सामग्री में हेरफेर करना चाहता है, तो उसे डेटा की मात्रा की परवाह किए बिना, धाराओं का उपयोग करना चाहिए। नेटवर्कस्ट्रीम के लिए भी यही कथन सही है। दी, यदि प्रोग्रामर कोडिंग सी की तरह एक निचले स्तर की भाषा है, तो यह एक डिस्क या सॉकेट के लिए सीधे चार्ट या बाइट लिखना संभव है, लेकिन यहां तक ​​कि थोड़ी मात्रा में डेटा के लिए, यह समय लेने वाली है और इसके लिए अधिक प्रवण है त्रुटि।
सी। 1

10

स्ट्रीम physicalबाइट्स की एक धारा पर एक अमूर्त (या एक आवरण) है । इस physicalधारा को कहा जाता है base stream। तो वहाँ हमेशा एक आधार धारा है जिस पर एक धारा आवरण बन जाता है और यानी आधार स्ट्रीम प्रकार के बाद इस प्रकार आवरण नाम दिया गया है FileStream, MemoryStreamआदि

स्ट्रीम रैपर का लाभ यह है कि आपको किसी भी अंतर्निहित प्रकार की धाराओं के साथ बातचीत करने के लिए एकीकृत एपीआई मिलता है usb, file

आप डेटा को स्ट्रीम के रूप में क्यों मानेंगे - क्योंकि डेटा विखंडनों को ऑन-डिमांड लोड किया जाता है, हम संपूर्ण डेटा को मेमोरी में लोड करने के बजाय डेटा को चंक्स के रूप में निरीक्षण / संसाधित कर सकते हैं। यह है कि अधिकांश प्रोग्राम बड़ी फ़ाइलों के साथ सौदा करते हैं, उदाहरण के लिए, ओएस छवि फ़ाइल को एन्क्रिप्ट करने के लिए।


4

केवल एक मूल प्रकार है Stream। हालांकि विभिन्न परिस्थितियों में कुछ सदस्यों को अपवाद कहा जाएगा क्योंकि उस संदर्भ में ऑपरेशन उपलब्ध नहीं था।

उदाहरण के लिए, MemoryStreamबाइट्स को मेमोरी के एक हिस्से से बाहर ले जाने का एक तरीका है। इसलिए आप इस पर Read और Write को कॉल कर सकते हैं।

दूसरी ओर FileStreamआपको एक फ़ाइल से पढ़ने या लिखने (या दोनों) की अनुमति देता है। चाहे आप वास्तव में पढ़ें या लिखें यह निर्भर करता है कि फ़ाइल कैसे खोली गई थी। यदि आपने इसे केवल रीड एक्सेस के लिए खोला है, तो आप एक फ़ाइल में नहीं लिख सकते।


3

मैं MSDN पर धाराओं को पढ़कर शुरू करूंगा: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

Memorystream और FileStream क्रमशः कच्ची मेमोरी और फ़ाइलों के साथ काम करने के लिए उपयोग की जाने वाली धाराएँ हैं ...


लिंक के लिए धन्यवाद। मुझे अच्छा लगा कि "आप स्रोत कोड के माध्यम से ऑनलाइन ब्राउज़ कर सकते हैं, ऑफ़लाइन देखने के लिए संदर्भ डाउनलोड कर सकते हैं, और डिबगिंग के दौरान स्रोतों (पैच और अपडेट सहित) के माध्यम से कदम उठा सकते हैं"। यह सुविधा नए स्तर की अंतर्दृष्टि प्रदान करती है।
डेविड

1

मैं उन विभिन्न प्रकार की धाराओं को नहीं कहूंगा। स्ट्रीम क्लास में CanRead और CanWrite गुण हैं जो आपको बताते हैं कि क्या विशेष स्ट्रीम को पढ़ा और लिखा जा सकता है।

विभिन्न स्ट्रीम कक्षाओं (जैसे कि मेमोरीस्ट्रीम बनाम फाइलस्ट्रीम) के बीच प्रमुख अंतर बैकिंग स्टोर है - जहां से डेटा पढ़ा जाता है या जहां इसे लिखा जाता है। यह नाम से स्पष्ट है। एक मेमोरीस्ट्रीम डेटा को केवल मेमोरी में स्टोर करता है, एक फाइलस्ट्रीम डिस्क पर एक फाइल द्वारा समर्थित है, एक नेटवर्कस्ट्रीम नेटवर्क से डेटा पढ़ता है और इसी तरह।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.