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
A स्ट्रिंगच्या आतील बफरवर एक स्ट्रिंग लिहीली जाते 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नकळत वर्गाच्या पद्धती कॉल करत आहात!

व्यावहारिक वापर

Java मध्ये हा मनोरंजक वर्ग आहे 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