1. OutputStreamवर्ग

हमने अभी हाल ही में इनपुट स्ट्रीम की खोज की है। आउटपुट स्ट्रीम के बारे में बात करने का समय आ गया है।

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

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

लेकिन वापस OutputStreamकक्षा में। इस वर्ग के पास ऐसी विधियाँ हैं जो इसके सभी वंशज वर्गों को लागू करनी चाहिए। यहाँ मुख्य हैं:

तरीकों विवरण
void write(int b)
intस्ट्रीम में एक बाइट (नहीं) लिखता है ।
void write(byte[] buffer)
स्ट्रीम में बाइट्स की एक सरणी लिखता है
void write(byte[] buffer, off, len)
स्ट्रीम में बाइट्स की एक सरणी का हिस्सा लिखता है
void flush()
बफर में संग्रहीत सभी डेटा को स्ट्रीम में लिखता है
void close()
धारा बंद कर देता है

जब आप किसी ऐसे वर्ग का ऑब्जेक्ट बनाते हैं जो इनहेरिट करता है InputStream, तो आप आमतौर पर एक स्रोत ऑब्जेक्ट निर्दिष्ट करते हैं जो InputStreamडेटा पढ़ता है। जब आप किसी ऐसे वर्ग का ऑब्जेक्ट बनाते हैं जो इनहेरिट करता है OutputStream, तो आप आमतौर पर उस लक्षित ऑब्जेक्ट या स्ट्रीम को भी निर्दिष्ट करते हैं जिस पर डेटा लिखा जाएगा।

आइए संक्षेप में OutputStreamकक्षा के सभी तरीकों से गुजरते हैं:

write(int b)तरीका

intयह विधि आउटपुट स्ट्रीम में एक बाइट (नहीं) लिखती है । पास किया गया मान एक बाइट में डाला जाता है, और int के पहले तीन बाइट्स को छोड़ दिया जाता है।

write(byte[] buffer)तरीका

बाइट्स की दी गई सरणी को आउटपुट स्ट्रीम में लिखता है। इतना ही।

write(byte[] buffer, int offset, int length)तरीका

बाइट्स के पारित सरणी के एक हिस्से को आउटपुट स्ट्रीम में लिखता है। ऑफ़सेट चर सरणी के पहले तत्व के सूचकांक को इंगित करता है, और lengthलिखे जाने वाले सबसेट की लंबाई है।

flush()तरीका

विधि flush()का उपयोग वर्तमान स्ट्रीम में संभावित रूप से बफ़र किए गए किसी भी डेटा को लक्ष्य स्ट्रीम में लिखे जाने के लिए बाध्य करने के लिए किया जाता है। बफ़रिंग और/या एक श्रृंखला में व्यवस्थित एकाधिक स्ट्रीम ऑब्जेक्ट्स का उपयोग करते समय यह प्रासंगिक है।

close()तरीका

किसी भी अलिखित डेटा को लक्ष्य वस्तु पर लिखता है। यदि आप ब्लॉक का उपयोग करते हैं तो विधि close()को कॉल करने की आवश्यकता नहीं है ।try-with-resources

फ़ाइल की प्रतिलिपि बनाने का उदाहरण

कोड टिप्पणी
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamएक फ़ाइल से पढ़ने
OutputStreamके लिए एक फ़ाइल में लिखने के लिए

बफ़र जिसमें हम डेटा को
तब तक पढ़ेंगे जब तक स्ट्रीम में डेटा है

डेटा को बफर में पढ़ें
बफर से डेटा को दूसरी स्ट्रीम में लिखें

2. Writerवर्ग

वर्ग Writerबिल्कुल वर्ग के समान है OutputStream, लेकिन एक बार फिर केवल एक अंतर है: यह charबाइट्स के बजाय वर्णों () के साथ काम करता है।

यह एक अमूर्त वर्ग है: आप Writerकक्षा की वस्तुएँ नहीं बना सकते। इसका मुख्य लक्ष्य सैकड़ों वंश वर्गों के लिए एक सामान्य मूल वर्ग बनना और उन्हें वर्ण धाराओं के साथ काम करने के लिए सामान्य तरीके देना है।

वर्ग के तरीके Writer(और उसके सभी वंशज वर्ग):

तरीकों विवरण
void write(int b)
intस्ट्रीम में एक वर्ण (नहीं) लिखता है ।
void write(char[] buffer)
धारा में वर्णों की एक सरणी लिखता है
void write(char[] buffer, off, len)
धारा में वर्णों की एक सरणी का हिस्सा लिखता है
void write(String str)
धारा को एक स्ट्रिंग लिखता है
void write(String str, off, len)
धारा के लिए एक स्ट्रिंग का हिस्सा लिखता है
void flush()
बफर में संग्रहीत सभी डेटा को स्ट्रीम में लिखता है
void close()
धारा बंद कर देता है

विधियां कक्षा के तरीकों के समान ही हैं OutputStream, लेकिन वे बाइट्स के बजाय वर्णों के साथ काम करते हैं।

तरीकों का विवरण:

write(int b)तरीका

यह विधि आउटपुट स्ट्रीम में एक वर्ण ( char- नहीं ) लिखती है। intपास किया गया मान a में डाला जाता है char, और पहले दो बाइट्स को छोड़ दिया जाता है।

write(char[] buffer)तरीका

आउटपुट स्ट्रीम में वर्णों की दी गई सरणी लिखता है।

write(char[] buffer, int offset, int length)तरीका

वर्णों के पारित सरणी के एक हिस्से को आउटपुट स्ट्रीम में लिखता है। चर offsetसरणी के पहले तत्व के सूचकांक को इंगित करता है, और lengthलिखे जाने वाले सबसेट की लंबाई है।

write(String str)तरीका

दिए गए स्ट्रिंग को आउटपुट स्ट्रीम में लिखता है।

write(String str, int offset, int length)तरीका

दिए गए स्ट्रिंग के एक हिस्से को आउटपुट स्ट्रीम में लिखता है: स्ट्रिंग को वर्णों की एक सरणी में बदल दिया जाता है। चर offsetसरणी के पहले तत्व के सूचकांक को इंगित करता है, और lengthलिखे जाने वाले सबसेट की लंबाई है।

flush()तरीका

विधि flush()का उपयोग वर्तमान स्ट्रीम में संभावित रूप से बफ़र किए गए किसी भी डेटा को लक्ष्य स्ट्रीम में लिखे जाने के लिए बाध्य करने के लिए किया जाता है। बफ़रिंग और/या एक श्रृंखला में व्यवस्थित एकाधिक स्ट्रीम ऑब्जेक्ट्स का उपयोग करते समय यह प्रासंगिक है।

close()तरीका

किसी भी अलिखित डेटा को लक्ष्य वस्तु पर लिखता है। यदि आप ब्लॉक का उपयोग करते हैं तो विधि close()को कॉल करने की आवश्यकता नहीं है ।try-with-resources

एक प्रोग्राम का उदाहरण जो एक पाठ फ़ाइल की प्रतिलिपि बनाता है:

कोड टिप्पणी
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerफ़ाइल से पढ़ने
Writerके लिए फ़ाइल में लिखने के लिए

बफ़र जिसमें हम डेटा को
तब तक पढ़ेंगे जब तक स्ट्रीम में डेटा है

एक बफर में डेटा पढ़ें
बफर से दूसरी स्ट्रीम में डेटा लिखें

StringWriterकक्षा

एक और दिलचस्प वर्ग है जो Writerवर्ग को विरासत में मिला है: इसे कहा जाता है StringWriter। इसमें एक परिवर्तनशील स्ट्रिंग है - एक StringBufferवस्तु। और हर बार जब आप ऑब्जेक्ट में कुछ "लिखते" हैं StringWriter, तो टेक्स्ट को उसके आंतरिक बफर में जोड़ दिया जाता है।

उदाहरण:

कोड टिप्पणी
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
एक लक्ष्य वर्ण धारा ( StringWriter) बनाई जाती है
एक स्ट्रिंग को बफर के अंदर लिखा जाता है एक स्ट्रिंग को एक वस्तु की सामग्री को एक स्ट्रिंग में परिवर्तित करने के StringWriter
अंदर बफर को लिखा जाता हैStringWriter

इस मामले में, StringWriterवर्ग अनिवार्य रूप से वर्ग के ऊपर एक आवरण है StringBuffer, लेकिन StringWriterवर्ग धारा वर्ग का वंशज है Writer, और इसका उपयोग धारा वस्तुओं की श्रृंखला में किया जा सकता है। यह व्यवहार में एक बहुत ही उपयोगी संपत्ति है।



3. PrintStreamवर्ग

आउटपुट स्ट्रीम क्लासेस को इंटरमीडियरी स्ट्रीम्स के साथ एक चेन में भी रखा जा सकता है जो उन्हें पास की गई टार्गेट स्ट्रीम को डेटा लिखते हैं। इन धाराओं की परस्पर क्रिया का सामान्य दृश्य इस प्रकार है:

प्रिंटस्ट्रीम क्लास

सभी इंटरमीडिएट आउटपुट स्ट्रीम का सबसे दिलचस्प और बहुमुखी है PrintStream। इसमें दसियों तरीके और 12 कंस्ट्रक्टर हैं।

PrintStreamवर्ग उस वर्ग को इनहेरिट करता है , FilterOutputStreamजो इनहेरिट करता है OutputStream। इसका मतलब है कि कक्षा में अपने स्वयं के तरीकों के अलावा मूल वर्ग के सभी तरीकेPrintStream हैं । यहाँ सबसे दिलचस्प हैं:

तरीकों विवरण
void print(obj)
पारित वस्तु को एक स्ट्रिंग में परिवर्तित करता है और इसे लक्ष्य धारा में आउटपुट करता है।
void println(obj)
पारित वस्तु को एक स्ट्रिंग में परिवर्तित करता है और इसे लक्ष्य धारा में आउटपुट करता है। अंत में एक लाइन ब्रेक जोड़ता है
void println()
टारगेट स्ट्रीम के लिए एक लाइन ब्रेक कैरेक्टर को आउटपुट करता है
PrintStream format(String format, args...)
प्रारूप स्ट्रिंग और पास किए गए तर्कों के आधार पर एक स्ट्रिंग का निर्माण और आउटपुट करता है; String.format()विधि के समान

और ये दस विधियाँ कहाँ हैं, तुम पूछते हो?

खैर, इसके कई प्रकार हैं print()तथा println()विभिन्न मापदंडों के साथ तरीके। उन्हें इस तालिका में संक्षेपित किया जा सकता है।

हम इन विधियों में गोता नहीं लगाएंगे, क्योंकि आप उन्हें पहले से ही अच्छी तरह जानते हैं। क्या आप अनुमान लगा सकते हैं कि मुझे क्या मिल रहा है?

याद है System.out.println()? लेकिन इसे दो पंक्तियों में लिखा जा सकता है:

कोड कंसोल आउटपुट
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

हमारा पसंदीदा कमांड क्लास के स्टैटिक वेरिएबल पर मेथड को कॉल करना है । और इस वेरिएबल का प्रकार है ।System.out.println()println()outSystemPrintStream

बहुत सारे CodeGym स्तरों में, और लगभग हर कार्य में, आप PrintStreamबिना जाने ही कक्षा के तरीकों को बुला रहे हैं!

प्रायोगिक उपयोग

जावा में यह दिलचस्प वर्ग है जिसे कहा जाता है ByteArrayOutputStream, जो एक गतिशील रूप से बढ़ने वाली बाइट सरणी है जो इनहेरिट करती है OutputStream

एक ByteArrayOutputStreamवस्तु और PrintStreamवस्तु को इस तरह जंजीर से बांधा जा सकता है:

कोड विवरण
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Hello");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
मेमोरी में राइट बफ़र बनाएं किसी ऑब्जेक्ट

में बफ़र लपेटें कंसोल पर डेटा लिखें सरणी को एक स्ट्रिंग में बदलें! कंसोल आउटपुट:PrintStream








Hello!
123