2009-09-10 19 views
80

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

अगर मैं सही ढंग से समझ, तीन धारा प्रकार हैं:

  • stream
  • read stream
  • write stream

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

+11

आप http://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streams – Preets

+1

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

उत्तर

47

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

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

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

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

+3

तो, यदि मैं सही ढंग से समझता हूं, तो स्ट्रीम में डेटा होता है और इसके साथ कुछ भी नहीं करता है। पाठक और लेखक 'सहायक' वर्ग स्ट्रीम के भीतर डेटा को नियंत्रित (कुशलतापूर्वक) कर सकते हैं? – Martijn

+6

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

+0

अतिरिक्त रूप से, StreamReader और StreamWriter टेक्स्ट (चरित्र) स्ट्रीम पढ़ने और लिखने के लिए हैं। – 1c1cle

0

अच्छी तरह से आप दोनों मामलों में स्ट्रीम को पढ़ और लिख सकते हैं, एक मेमोरीस्ट्रीम कुछ ऐसी चीज है जिसे आप घोषित कर सकते हैं ताकि आप स्मृति में डेटा के साथ काम कर सकें और फ़ाइल स्ट्रीम एक स्ट्रीम है जो फ़ाइल को इंगित करती है आप एक फाइल स्ट्रीम लिखते हैं या पढ़ते हैं तो आप फ़ाइल को पढ़ रहे/लिख रहे हैं।

2

मैं धाराओं पर MSDN पर ऊपर से पढ़ना प्रारंभ होगा: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

MemoryStream और FileStream कच्चे स्मृति और क्रमशः फाइलों के साथ काम करने के लिए इस्तेमाल धाराएं हैं ...

+0

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

3

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

उदाहरण के लिए एक MemoryStream बस में और स्मृति का एक हिस्सा से बाहर ले जाता है बाइट्स के लिए एक रास्ता है। इसलिए आप इसे पढ़ और लिख सकते हैं।

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

1

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

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

15

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

+0

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

+2

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

40

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

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

हालांकि, .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') लिखेंगे। यदि आप टेक्स्ट फ़ाइलों (उदा। एचटीएमएल) से निपट रहे हैं, तो StreamReader और StreamWriter वे कक्षाएं हैं जिनका आप उपयोग करेंगे।

myBinaryWriter.Write(123); 

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

2

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

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

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

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