"हैलो, अमीगो! अब मैं आपको दो इंटरफेस के बारे में बताता हूँ: इनपुटस्ट्रीम और आउटपुटस्ट्रीम । उन्हें एब्स्ट्रैक्ट क्लासेस के रूप में घोषित किया जाता है, लेकिन अगर आप गहराई से देखें तो आप देख सकते हैं कि वे अनिवार्य रूप से इंटरफेस हैं । उनके लगभग सभी तरीके अमूर्त हैं, सिवाय इसके कि कुछ महत्वहीन तरीके। वे बहुत हद तक " अंगरक्षक " के समान हैं जिन्हें हमने पहले माना था।

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

"ठीक है। तो ये इंटरफेस क्या हैं?"

"मैं आगे की हलचल के बिना आपको बता दूँगा।"

जावा में यह दिलचस्प चीज है जिसे « धारा » कहा जाता है। एक धारा एक बहुत ही सरल इकाई है। और इसकी सादगी डेटा के आदान-प्रदान के एक बहुत शक्तिशाली तरीके की कुंजी है। धाराएँ दो प्रकार की होती हैं: पढ़ने के लिए धाराएँ और लिखने के लिए धाराएँ

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

InputStream  एक स्ट्रीम का इंटरफ़ेस है जो पढ़ने का समर्थन करता है। यह निम्नलिखित क्षमता को परिभाषित करता है: «बाइट्स को मुझसे पढ़ा जा सकता है»।

इसी तरह, OutputStream , OutputStream एक स्ट्रीम के लिए एक इंटरफ़ेस है जो लेखन का समर्थन करता है। यह निम्नलिखित क्षमता को परिभाषित करता है: «बाइट्स मुझे लिखी जा सकती हैं»।

"इतना ही?"

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

डिस्क पर किसी फ़ाइल से डेटा पढ़ने के लिए, हमारे पास विशेष FileInputStream क्लास है, जो InputStream इंटरफ़ेस को लागू करती है। क्या आप इस डेटा को दूसरी फ़ाइल में लिखना चाहते हैं? इसके लिए, हमारे पास FileOutputStream वर्ग है, जो OutputStream इंटरफ़ेस को लागू करता है। निम्न कोड दिखाता है कि डेटा को एक फ़ाइल से दूसरी फ़ाइल में कॉपी करने के लिए आपको क्या करना होगा।

कोड
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

कल्पना कीजिए कि हमने एक वर्ग लिखा है और  इसमें इनपुटस्ट्रीम  और  आउटपुटस्ट्रीम क्षमताओं को जोड़ा है।

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

"शायद एक उदाहरण?"

"ज़रूर।"

कोड विवरण
class MyClass
{
private ArrayList<Integer> list;
}
सादगी के लिए, कल्पना करें कि हमारी कक्षा में एक वस्तु है, एक ArrayList जिसमें पूर्णांक हैं।

अब हम इसमें पढ़ने और लिखने के तरीके जोड़ेंगे

कोड विवरण
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
अब हमारी कक्षा पढ़ने की विधि को लागू करती है, जिससे सूची की संपूर्ण सामग्री को क्रमिक रूप से पढ़ना संभव हो जाता है ।

और लिखने की विधि, जिससे आप हमारी सूची में मान लिख सकते हैं।

बेशक, यह InputStream और OutputStream इंटरफेस का कार्यान्वयन नहीं है, लेकिन यह बहुत समान है।

"हाँ, मैं समझता हूँ। तो आप इस तरह की वस्तु की सामग्री को फ़ाइल में कैसे सहेजते हैं?"

"मैं आपको एक उदाहरण देता हूं:"

फ़ाइल में MyClass ऑब्जेक्ट लिखें
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
फ़ाइल से MyClass ऑब्जेक्ट पढ़ें
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

"होली मोली! यह वास्तव में इनपुटस्ट्रीम/आउटपुटस्ट्रीम के साथ काम करने के समान है। स्ट्रीम बहुत प्यारी हैं!"

"और फिर कुछ!"