"আবার আমি."

"হাই, এলি!"

"আজ আমি আপনাকে বাফারডরিডার এবং বাফারডরাইটার সম্পর্কে সব বলতে চাই ।"

"আপনি ইতিমধ্যে আমাকে তাদের সম্পর্কে বলেছেন। তারা সত্যিই জটিল নয়।"

"ঠিক আছে। তাহলে বলুন কিভাবে বাফারডরিডার কাজ করে।"

" বাফারডরিডার একটি 110/220V রূপান্তরকারীর মত।"

"আপনাকে BufferedReader কনস্ট্রাক্টরের কাছে পাঠাতে হবে যে রিডার অবজেক্ট থেকে ডেটা পড়া হবে৷ একটি BufferedReader অবজেক্ট রিডার থেকে প্রচুর পরিমাণে ডেটা পড়ে এবং সেগুলিকে একটি বাফারে অভ্যন্তরীণভাবে সঞ্চয় করে৷ সেই কারণেই একটি রিডার থেকে পড়ার জন্য একটি BufferedReader ব্যবহার করা দ্রুততর হয় ৷ একজন পাঠকের কাছ থেকে সরাসরি পড়ার চেয়ে ।"

"ঠিক আছে। আর বাফারডরাইটারের কি হবে ?"

"এটি একটি কেকের টুকরো। ধরুন আমরা একটি FileWriter- এ লিখি । ডাটা অবিলম্বে ডিস্কে লেখা হয়। যদি আমরা ঘন ঘন ডেটার সামান্য বিট লিখি, তাহলে আমরা ডিস্ককে অনেক বেশি আঘাত করব, যা প্রোগ্রামটিকে অনেক কমিয়ে দেবে। কিন্তু যদি আমরা একটি BufferedWriter কে 'কনভার্টার' হিসেবে ব্যবহার করি, তাহলে লেখার কাজটি অনেক দ্রুত হয়। আপনি যখন একটি BufferedWriter- এ লেখেন , তখন এটি একটি অভ্যন্তরীণ বাফারে ডেটা সংরক্ষণ করে। যখন বাফারটি পূর্ণ হয়, তখন এটি রাইটারের কাছে ডেটা লিখে দেয় । একটি একক বড় অংশ। এটি অনেক দ্রুত।"

"হুম। স্পট অন। কিন্তু কি ভুলে গেছ?"

"আপনি লেখা শেষ করার পর, আপনাকে বাফারে থাকা কোনো ডেটা রাইটারের কাছে পাঠাতে বাধ্য করতে বাফারডরাইটার অবজেক্টে ফ্লাশ() পদ্ধতিতে কল করতে হবে ।"

"আর কি?"

"আর কি? ওহ! যতক্ষণ বাফারটি লেখকের কাছে লেখা না হয় , ততক্ষণ ডেটা মুছে ফেলা এবং/অথবা প্রতিস্থাপন করা যেতে পারে।"

"অ্যামিগো! আমি মুগ্ধ! আপনি একজন বিশেষজ্ঞ! ঠিক আছে, তারপর আমি আপনাকে কিছু নতুন ক্লাস সম্পর্কে বলব:  ByteArrayStream এবং PrintStream ।"

"উদাহরণস্বরূপ, ByteArrayInputStream এবং ByteArrayOutputStream ।"

"এই ক্লাসগুলি কিছুটা StringReader এবং StringWriter- এর মত। StringReader বাদে একটি স্ট্রিং ( String ) থেকে অক্ষর ( char ) পড়ে , কিন্তু InputStream একটি বাইট অ্যারে ( ByteArray ) থেকে বাইট পড়ে।"

StringWriter একটি স্ট্রিং-এ অক্ষর ( 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 দিয়ে প্রতিস্থাপন করেছি।"

"অন্য দুটি ধাপ হল স্ট্রিংকে বাইটঅ্যারেতে রূপান্তরিত করা এবং আবার ফিরে আসা। আপনি দেখতে পাচ্ছেন, এটি বেশ সহজে করা হয়েছে:"

একটি স্ট্রিংকে বাইটঅ্যারেতে রূপান্তর করা এবং আবার ফিরে আসা
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-এর সাথে মিলগুলো বেশ শক্তিশালী, বিশেষ করে আপনি সেগুলো আমার কাছে তুলে ধরার পরে। ধন্যবাদ, এলি, সত্যিই একটি আকর্ষণীয় পাঠের জন্য।"

"আপনি এত তাড়াহুড়ো করে কোথায় যাচ্ছেন? আমি এখনও আপনার জন্য একটি ছোট উপহার আছে। আমি আপনাকে প্রিন্টস্ট্রিম ক্লাস সম্পর্কে বলতে চাই।"

"প্রিন্টস্ট্রিম? এই প্রথম আমি সেই ক্লাসের কথা শুনলাম।"

"হ্যাঁ। বিশেষ করে, যদি আপনি এই সত্যটি গণনা না করেন যে আপনি আপনার জাভা অধ্যয়নের প্রথম দিন থেকে এটি ব্যবহার করছেন। আপনার কি মনে আছে System.out ? আচ্ছা, System.out হল সিস্টেমের একটি স্ট্যাটিক (শ্রেণী) পরিবর্তনশীল ক্লাস, এবং এর ধরন হল... প্রিন্টস্ট্রিম ! এখানেই এই সমস্ত প্রিন্ট, প্রিন্টএলএন, ইত্যাদি পদ্ধতির উৎপত্তি।"

"ওয়াও। কত মজার। আমি একরকম ভেবেও দেখিনি। আমাকে আরও বলুন।"

"ভাল। ঠিক আছে, শোন। প্রিন্টস্ট্রিম ক্লাসটি পঠনযোগ্য আউটপুটের জন্য উদ্ভাবিত হয়েছিল। এটি প্রায় সম্পূর্ণরূপে প্রিন্ট এবং প্রিন্টএলএন পদ্ধতি নিয়ে গঠিত। এই টেবিলটি দেখুন:"

পদ্ধতি পদ্ধতি
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)

"এছাড়াও বেশ কিছু বিন্যাস পদ্ধতি রয়েছে যাতে আপনি একটি ফর্ম্যাট স্ট্রিং ব্যবহার করে ডেটা আউটপুট করতে পারেন৷ উদাহরণস্বরূপ:"

একটি স্ট্রিংকে বাইটঅ্যারেতে রূপান্তর করা এবং আবার ফিরে আসা
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.

"হ্যাঁ, আমার মনে আছে। আমরা ইতিমধ্যেই স্ট্রিং ক্লাসের বিন্যাস পদ্ধতি অধ্যয়ন করেছি।"

"এখন এ পর্যন্তই."

"ধন্যবাদ, এলি।"