"तो मी पुन्हा आहे."

"हाय, एली!"

"आज मी तुम्हाला BufferedReader आणि BufferedWriter बद्दल सर्व काही सांगू इच्छितो ."

"तुम्ही मला त्यांच्याबद्दल आधीच सांगितले आहे. ते खरोखर इतके क्लिष्ट नाहीत."

"ठीक आहे. मग मला सांगा बफरेडरीडर कसे काम करते."

" बफरेडरीडर हे 110/220V कन्व्हर्टरसारखे आहे."

"तुम्हाला BufferedReader कन्स्ट्रक्टरकडे पाठवावे लागेल ते रीडर ऑब्जेक्ट ज्यामधून डेटा वाचला जाईल. एक बफरेडरीडर ऑब्जेक्ट रीडरकडून डेटाचे मोठे भाग वाचते आणि बफरमध्ये आंतरिकरित्या संग्रहित करते. म्हणूनच रीडरकडून वाचण्यासाठी बफरेडरीडर वापरणे जलद आहे. वाचकांकडून थेट वाचण्यापेक्षा ."

"बरोबर आहे. आणि BufferedWriter बद्दल काय ?"

"हा केकचा एक तुकडा आहे. समजा आपण एखाद्या FileWriter ला लिहितो. डेटा लगेच डिस्कवर लिहिला जातो. जर आपण वारंवार डेटाचे थोडेसे लिहीले, तर आपण डिस्कला खूप मारतो, ज्यामुळे प्रोग्राम खूप कमी होईल. परंतु जर आपण 'कन्व्हर्टर' म्हणून बफरडराईटरचा वापर केला , तर लेखन कार्य अधिक जलद होते. जेव्हा तुम्ही बफरडरायटरला लिहिता तेव्हा ते अंतर्गत बफरमध्ये डेटा जतन करते. जेव्हा बफर भरलेला असतो, तेव्हा तो लेखकाला डेटा म्हणून लिहितो . एक मोठा भाग. हे खूप वेगवान आहे."

"हम्म. स्पॉट ऑन. पण काय विसरलास?"

"तुम्ही लेखन पूर्ण केल्यानंतर, तुम्हाला बफरमध्ये असलेला कोणताही डेटा लेखकाला पाठवण्यासाठी सक्ती करण्यासाठी BufferedWriter ऑब्जेक्टवर flush() पद्धत कॉल करणे आवश्यक आहे ."

"आणि अजून काय?"

"दुसरं काय? अरे! जोपर्यंत बफर लेखकाला लिहिले जात नाही , तोपर्यंत डेटा हटवला जाऊ शकतो आणि/किंवा बदलला जाऊ शकतो."

"अमिगो! मी प्रभावित झालो! तुम्ही तज्ञ आहात! बरं, मग मी तुम्हाला काही नवीन वर्गांबद्दल सांगेन:  ByteArrayStream आणि PrintStream ."

"उदाहरणार्थ, ByteArrayInputStream आणि ByteArrayOutputStream ."

"हे वर्ग थोडेसे StringReader आणि StringWriter सारखे आहेत. StringReader वगळता स्ट्रिंग ( स्ट्रिंग ) मधील वर्ण ( char ) वाचतो , परंतु InputStream बाइट अॅरे ( ByteArray ) मधून बाइट वाचतो."

स्ट्रिंगरायटर स्ट्रिंगवर अक्षरे ( char ) लिहितो, तर ByteArrayOutputStream अंतर्गत बाइट अॅरेवर बाइट्स लिहितो. जेव्हा तुम्ही StringWriter ला लिहिता तेव्हा त्याची अंतर्गत स्ट्रिंग मोठी होते आणि जेव्हा तुम्ही ByteArrayOutputStream वर लिहिता तेव्हा त्याचा अंतर्गत बाइट अॅरे देखील गतिमानपणे विस्तारतो.

"गेल्या धड्यात तुम्हाला दिलेले उदाहरण लक्षात ठेवा:"

वाचक ऑब्जेक्टकडून वाचन आणि लेखक ऑब्जेक्टवर लिहिणे:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 StringReader reader = new StringReader(test);

 StringWriter writer = new StringWriter();

 executor(reader, writer);

 String result = writer.toString();

 System.out.println("Result: "+ result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 String line;
 while ((line = br.readLine()) != null) {
 StringBuilder sb = new StringBuilder(line);
 String newLine = sb.reverse().toString();

 writer.write(newLine);
 }
}

"अक्षरांच्या ऐवजी बाइट्स वापरून कार्य केले तर ते कसे दिसेल ते येथे आहे:"

इनपुटस्ट्रीम ऑब्जेक्टवरून वाचणे आणि आउटपुटस्ट्रीम ऑब्जेक्टवर लिहिणे:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 InputStream inputStream = new ByteArrayInputStream(test.getBytes());

 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

 executor(inputStream, outputStream);

 String result = new String(outputStream.toByteArray());
 System.out.println("Result: "+ result);
}

public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
 BufferedInputStream bis = new BufferedInputStream(inputStream);
 while (bis.available() > 0)
 {
  int data = bis.read();
  outputStream.write(data);
 }
}

"सर्व काही वरील उदाहरणाप्रमाणेच आहे. शिवाय, आम्ही स्ट्रिंगला ByteArray ने, रीडरला InputStream सह आणि लेखकाला OutputStream ने बदलले आहे."

"फक्त इतर दोन पायऱ्या म्हणजे स्ट्रिंगला ByteArray मध्ये रूपांतरित करणे आणि पुन्हा परत करणे. तुम्ही बघू शकता, हे अगदी सहजपणे केले जाते:"

स्ट्रिंगला ByteArray मध्ये रूपांतरित करणे आणि पुन्हा परत करणे
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 byte[] array = test.getBytes();

 String result = new String(array);
 System.out.println("Result: "+ result);
}

"ByteArrayOutputStream मध्ये आधीच जोडलेले बाइट्स मिळविण्यासाठी, toByteArray () पद्धतीला कॉल करा."

"अहो. StringReader/StringWriter मधील समानता खूपच मजबूत आहेत, विशेषत: तुम्ही त्या माझ्याकडे दाखविल्यानंतर. धन्यवाद, एली, खरोखर मनोरंजक धड्यासाठी."

"एवढ्या घाईत तू कुठे निघाला आहेस? माझ्याकडे तुझ्यासाठी एक छोटीशी भेट आहे. मला तुला प्रिंटस्ट्रीम क्लासबद्दल सांगायचे आहे."

"प्रिंटस्ट्रीम? मी त्या वर्गाबद्दल पहिल्यांदाच ऐकले आहे."

"हो. विशेषत:, तुम्ही तुमच्या Java अभ्यासाच्या पहिल्या दिवसापासून ते वापरत आहात हे तुम्ही मोजत नसल्यास. तुम्हाला System.out आठवते का ? बरं, System.out हे सिस्टीमचे स्थिर (वर्ग) व्हेरिएबल आहे. वर्ग, आणि त्याचा प्रकार आहे... PrintStream ! या सर्व प्रिंट, println, इ. पद्धती इथूनच उद्भवतात."

"व्वा. किती इंटरेस्टिंग आहे. मी कधी विचारही केला नाही. अजून सांग."

"चांगले. ठीक आहे, ऐका. प्रिंटस्ट्रीम क्लास वाचनीय आउटपुटसाठी शोधला गेला होता. यात जवळजवळ संपूर्णपणे प्रिंट आणि प्रिंटलन पद्धतींचा समावेश आहे. हे टेबल पहा:"

पद्धती पद्धती
void print(boolean b) void println(boolean b)
void print(char c) void println(char c)
void print(int c) void println(int c)
void print(long c) void println(long c)
void print(float c) void println(float c)
void print(double c) void println(double c)
void print(char[] c) void println(char[] c)
void print(String c) void println(String c)
void print(Object obj) void println(Object obj)
void println()
PrintStream format (String format, Object ... args)
PrintStream format (Locale l, String format, Object ... args)

"अनेक फॉरमॅट पद्धती देखील आहेत ज्यामुळे तुम्ही फॉरमॅट स्ट्रिंग वापरून डेटा आउटपुट करू शकता. उदाहरणार्थ:"

स्ट्रिंगला ByteArray मध्ये रूपांतरित करणे आणि पुन्हा परत करणे
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
स्क्रीन आउटपुट:
My name is Kolan. My age is 25.

"हो, मला आठवतं. आम्ही आधीच स्ट्रिंग क्लासच्या फॉरमॅट पद्धतीचा अभ्यास केला आहे."

"सध्या एवढेच."

"धन्यवाद, एली."