2009-08-01 9 views
70

प्रोग्रामिंग दुनिया में एक स्ट्रीम क्या है? हमें इसकी जरूरत क्यों है?स्ट्रीम क्या है?

यदि संभव हो, तो समानता की सहायता से कृपया समझाएं।

+8

यह http://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streams का डुप्लिकेट है। –

उत्तर

101

एक धारा ऑब्जेक्ट्स के अनुक्रम का प्रतिनिधित्व करती है (आमतौर पर बाइट्स, लेकिन जरूरी नहीं), जिसे क्रमिक क्रम में एक्सेस किया जा सकता है। एक स्ट्रीम पर विशिष्ट संचालन:

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

एक विशेष धारा को पढ़ने का समर्थन कर सकते हैं (: यह, पारसर्स के लिए कभी कभी उपयोगी है के रूप में है जो मामला यह एक "इनपुट स्ट्रीम" है), लेखन ("आउटपुट स्ट्रीम") या दोनों। सभी धाराएं तलाश योग्य नहीं हैं।

पुश बैक काफी दुर्लभ है, लेकिन आप आंतरिक इनपुट बफर रखने वाले किसी अन्य इनपुट स्ट्रीम में वास्तविक इनपुट स्ट्रीम को लपेटकर इसे हमेशा स्ट्रीम में जोड़ सकते हैं। बफर से पढ़ता है, और यदि आप वापस धक्का देते हैं तो डेटा बफर में रखा जाता है। यदि बफर में कुछ भी नहीं है तो पुश बैक स्ट्रीम वास्तविक स्ट्रीम से पढ़ता है। यह "स्ट्रीम एडेप्टर" का एक साधारण उदाहरण है: यह इनपुट स्ट्रीम के "अंत" पर बैठता है, यह एक इनपुट स्ट्रीम है, और यह कुछ अतिरिक्त करता है जो मूल स्ट्रीम नहीं करता है।

स्ट्रीम एक उपयोगी अमूर्तता है क्योंकि यह फाइलों का वर्णन कर सकता है (जो वास्तव में सरणी हैं, इसलिए तलाश सरल है) लेकिन टर्मिनल इनपुट/आउटपुट (जो बफर किए जाने तक खोजी नहीं जा सकती है), सॉकेट, सीरियल पोर्ट इत्यादि। तो आप कर सकते हैं कोड लिखें जो कहता है "मुझे कुछ डेटा चाहिए, और मुझे परवाह नहीं है कि यह कहां से आता है या यह कैसे मिला है", या "मैं कुछ डेटा दूंगा, और यह पूरी तरह से मेरे कॉलर पर निर्भर करता है"। पूर्व इनपुट इनपुट पैरामीटर लेता है, बाद वाला आउटपुट स्ट्रीम पैरामीटर लेता है।

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

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

+1

अब तक का सबसे अच्छा स्पष्टीकरण मैंने पढ़ा है। एसआईसीपी में जो कुछ भी कहता है उसके साथ मिलकर ("स्ट्रीम प्रोसेसिंग हमें उन मॉडलों को मॉडल करने देता है जिनके पास कभी भी असाइनमेंट या म्यूटेबल डेटा का उपयोग किए बिना राज्य है।"), मुझे लगता है कि मैं अंततः इसे प्राप्त करता हूं। धन्यवाद! –

24

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

सी #, वीबी.Net, सी ++, जावा इत्यादि जैसी भाषाओं में, धारा रूपक कई चीजों के लिए उपयोग किया जाता है। फ़ाइल स्ट्रीम हैं, जिसमें आप एक फ़ाइल खोलते हैं और स्ट्रीम से पढ़ सकते हैं या लिख ​​सकते हैं; नेटवर्क स्ट्रीम हैं जहां स्ट्रीम से पढ़ना और लिखना एक अंतर्निहित स्थापित नेटवर्क कनेक्शन से पढ़ता है और लिखता है। this उदाहरण के रूप में केवल पढ़ने के लिए स्ट्रीम को सामान्य रूप से आउटपुट स्ट्रीम कहा जाता है, और इसी तरह, स्ट्रीम पढ़ने के लिए केवल स्ट्रीम को इनपुट स्ट्रीम कहा जाता है, जैसा कि this उदाहरण में है।

एक स्ट्रीम डेटा के रूपांतरण या एन्कोडिंग (SslStream नेट में कर सकती है, उदाहरण के लिए, एसएसएल वार्तालाप डेटा खाएगा और इसे आपसे छुपाएगा; एक टेलनेटस्ट्रीम आपके द्वारा टेलनेट वार्तालाप छुपा सकता है, लेकिन पहुंच प्रदान करता है डेटा; जावा में ZipOutputStream आपको ज़िप फ़ाइल प्रारूप के आंतरिक के बारे में चिंता किए बिना ज़िप संग्रह में फ़ाइलों को लिखने की अनुमति देता है।

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

कुछ धाराएं this उदाहरण में यादृच्छिक पहुंच का भी समर्थन करती हैं। दूसरी ओर, एक नेटवर्क स्ट्रीम स्पष्ट कारणों से नहीं होगा।

  • MSDN नेट में स्ट्रीम का एक अच्छा अवलोकन देता है।
  • सूर्य में उनके सामान्य OutputStream वर्ग और InputStream कक्षा का एक सिंहावलोकन भी है।
  • सी ++ में, istream (इनपुट स्ट्रीम), ostream (आउटपुट स्ट्रीम) और iostream (बिडरेक्शनल स्ट्रीम) दस्तावेज है।

ऑपरेटिंग सिस्टम जैसे यूनिक्स प्रोग्राम इनपुट और आउटपुट के साथ स्ट्रीम मॉडल का भी समर्थन करते हैं, जैसा कि here वर्णित है।

5

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

4

एक और समानता: आप एक धारा के खिलाफ तैर नहीं सकते हैं, यही कारण है कि आप स्ट्रीम से अगली बिट, बाइट, स्ट्रिंग या ऑब्जेक्ट ले सकते हैं, जबकि पहले से ही पढ़ा गया डेटा हटा दिया गया है। एकतरफा टिकेट...या मूल रूप से केवल कतार दृढ़ता से संग्रह किए बिना।

तो क्या हमें कतारों की आवश्यकता है? आप तय करें।

+0

इसका मतलब है कि एक धारा में, आपको आगे बढ़ना होगा पिछड़ा नहीं जा सकता। इसके अतिरिक्त पिछला डेटा हटा दिया गया है क्योंकि आप आगे बढ़ते हैं जो स्मृति को सहेजता है? दाएं –

3

शब्द "स्ट्रीम" चुना गया है क्योंकि यह (वास्तविक जीवन में) का प्रतिनिधित्व करता है, जिसे हम इसका उपयोग करते समय व्यक्त करना चाहते हैं।

जल धारा के समानता के बारे में सोचना शुरू करें। आपको लगातार नदी का प्रवाह मिलता है, जैसे कि नदी लगातार पानी में बहती है। आपको जरूरी नहीं पता कि डेटा कहां से आ रहा है, और अक्सर आपको इसकी आवश्यकता नहीं होती है; यह एक फ़ाइल, एक सॉकेट, या किसी अन्य स्रोत से हो, यह वास्तव में मायने रखता नहीं है (नहीं)। यह पानी की धारा प्राप्त करने के समान ही है, जिससे आपको यह जानने की आवश्यकता नहीं है कि यह कहां से आ रहा है; यह एक झील, एक फव्वारा, या किसी अन्य स्रोत से हो, यह वास्तव में कोई फर्क नहीं पड़ता (नहीं)। source