"हैलो, अमीगो! आज हम इनपुट/आउटपुट स्ट्रीम से परिचित होंगे । हमने कुछ दिन पहले इस विषय को चुना था, लेकिन आज हम इसे अच्छी तरह से एक्सप्लोर करेंगे। इनपुट/आउटपुट स्ट्रीम को 4 श्रेणियों में विभाजित किया गया है:"

1) धाराएँ उनकी दिशा के अनुसार विभाजित होती हैं: इनपुट धाराएँ और आउटपुट धाराएँ

2) धाराओं को उनके डेटा प्रकार के अनुसार विभाजित किया जाता है: वे जो बाइट्स के साथ काम करते हैं और जो वर्णों के साथ काम करते हैं ।

यहाँ इन विभाजनों को एक तालिका में दर्शाया गया है:

आगत प्रवाह आउटपुट स्ट्रीम
बाइट्स के साथ काम करता है आगत प्रवाह आउटपुटस्ट्रीम
पात्रों के साथ काम करता है पाठक लेखक

यदि कोई वस्तु InputStream इंटरफ़ेस को लागू करती है, तो यह क्रमिक रूप से बाइट्स को पढ़ने की क्षमता का समर्थन करती है।

यदि कोई वस्तु OutputStream इंटरफ़ेस को लागू करती है, तो यह क्रमिक रूप से बाइट्स लिखने की क्षमता का समर्थन करती है।

यदि कोई वस्तु रीडर इंटरफ़ेस को लागू करती है, तो यह क्रमिक रूप से वर्णों (वर्णों) को पढ़ने की क्षमता का समर्थन करती है।

यदि कोई वस्तु राइटर इंटरफ़ेस को लागू करती है, तो यह क्रमिक रूप से वर्ण (वर्ण) लिखने की क्षमता का समर्थन करती है।

इनपुट/आउटपुट स्ट्रीम - 1

एक आउटपुट स्ट्रीम एक प्रिंटर की तरह है। हम दस्तावेज़ों को प्रिंटर पर आउटपुट कर सकते हैं। हम डेटा को आउटपुट स्ट्रीम में आउटपुट कर सकते हैं।

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

"वे कहाँ उपयोग किए जाते हैं?"

"इन कक्षाओं का उपयोग जावा में हर जगह किया जाता है। हमारा परिचित मित्र System.in एक स्थिर InputStream चर है जिसे सिस्टम वर्ग में नामित किया गया है "

"गंभीरता से?! तो इस समय मैं एक इनपुटस्ट्रीम का उपयोग कर रहा हूं और मुझे इसका एहसास भी नहीं हुआ। क्या System.out भी एक स्ट्रीम है?"

"हां, System.out सिस्टम क्लास में एक स्थिर प्रिंटस्ट्रीम ( आउटपुटस्ट्रीम का वंशज ) चर है।"

"आप मुझे बताना चाहते हैं कि मैं हमेशा धाराओं का उपयोग करता रहा हूं और यह भी नहीं जानता था?"

"हाँ, और यह हमें बताता है कि ये धाराएँ कितनी सुविधाजनक हैं। आप बस एक को पकड़ें और उसका उपयोग करें।"

"लेकिन आप System.in के बारे में ऐसा नहीं कह सकते। हमें लगातार इसमें BufferedReader या InputStreamReader जोड़ना पड़ता था।"

"यह सच है। लेकिन उसके भी कारण थे।"

बहुत सारे डेटा प्रकार हैं, और उनके साथ काम करने के कई तरीके हैं। इसलिए मानक I/O कक्षाओं की संख्या बहुत तेज़ी से बढ़ी, हालाँकि उन्होंने सब कुछ लगभग उसी तरह किया। इस जटिलता से बचने के लिए, जावा डेवलपर्स ने अमूर्तता के सिद्धांत का उपयोग किया और कक्षाओं को कई छोटे भागों में विभाजित किया।

लेकिन आप इन भागों को सुसंगत तरीके से जोड़ सकते हैं और यदि आवश्यक हो तो बहुत ही जटिल कार्यक्षमता प्राप्त कर सकते हैं। इस उदाहरण को देखें:

कंसोल के लिए एक स्ट्रिंग आउटपुट करें
System.out.println("Hello");
कंसोल आउटपुट स्ट्रीम को एक अलग चर में स्टोर करें।
स्ट्रीम में एक स्ट्रिंग आउटपुट करें।
PrintStream console = System.out;
console.println("Hello");
स्मृति में गतिशील (विस्तारित) बाइट सरणी बनाएँ।
इसे एक नई आउटपुट स्ट्रीम (प्रिंटस्ट्रीम ऑब्जेक्ट) से कनेक्ट करें।
स्ट्रीम में एक स्ट्रिंग आउटपुट करें।
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"ईमानदारी से, यह एक लेगो सेट की तरह है। केवल मुझे यह स्पष्ट नहीं है कि यह कोड क्या कर रहा है।"

"अभी इसके बारे में चिंता मत करो। सब कुछ अपने नियत समय पर।"

यह वही है जो मैं चाहता हूं कि आप याद रखें: यदि कोई वर्ग OutputStream इंटरफ़ेस लागू करता है, तो आप उसे बाइट लिख सकते हैं। लगभग ठीक वैसे ही जैसे आप कंसोल में डेटा आउटपुट करते हैं। यह इसके साथ क्या करता है इसका व्यवसाय है। हमारे "लेगो किट" के साथ, हम प्रत्येक भाग के उद्देश्य के बारे में परवाह नहीं करते हैं। हम इस तथ्य की परवाह करते हैं कि भागों का बड़ा चयन हमें ऐसी अच्छी चीजें बनाने देता है।

"ठीक है। फिर हम कहाँ से शुरू करें?"