"হ্যালো, অ্যামিগো! আজ আমরা ইনপুটস্ট্রিম এবং আউটপুট স্ট্রীম কীভাবে কাজ করে তা আবারও খনন করতে যাচ্ছি। প্রাথমিক ব্যাখ্যাটি আসলে একটু সরলীকৃত ছিল। এগুলি ইন্টারফেস নয়। এগুলি বিমূর্ত ক্লাস, এবং তাদের কয়েকটি বাস্তবায়িত পদ্ধতিও রয়েছে৷ আসুন তাদের পদ্ধতিগুলি দেখে নেওয়া যাক:"

ইনপুটস্ট্রিম পদ্ধতি পদ্ধতি কি করে
int read(byte[] buff);
এই পদ্ধতিটি অবিলম্বে বাফারে বাইটের একটি ব্লক পড়ে ( বাইট অ্যারে ), যতক্ষণ না বাফারটি পূর্ণ হয় বা যতক্ষণ না উৎসে পড়ার জন্য আর কোনও বাইট না থাকে।
পদ্ধতিটি আসলে পঠিত বাইটের সংখ্যা প্রদান করে (যা অ্যারের দৈর্ঘ্যের চেয়ে কম হতে পারে)
int read();
এই পদ্ধতিটি একটি বাইট পড়ে এবং এটি ফেরত দেয়। ফলাফল চেহারা জন্য একটি int প্রশস্ত করা হয়. যদি পড়ার জন্য আর কোন বাইট না থাকে তবে পদ্ধতিটি -1 প্রদান করে।
int available();
এই পদ্ধতি অপঠিত (উপলভ্য) বাইটের সংখ্যা প্রদান করে।
void close();
এই পদ্ধতিটি প্রবাহকে "বন্ধ" করে। আপনি যখন স্ট্রীমের সাথে কাজ শেষ করেন তখন আপনি এটিকে কল করেন।
বস্তুটি তখন ফাইলটি বন্ধ করার জন্য প্রয়োজনীয় হাউসকিপিং ক্রিয়াকলাপগুলি সম্পাদন করে, ইত্যাদি৷
এই সময়ে, আপনি স্ট্রীম থেকে আর কোনও ডেটা পড়তে পারবেন না৷

"তাহলে আমরা কেবল একক বাইটই নয়, পুরো ব্লকগুলিও পড়তে পারি?"

"ঠিক।"

"আমরা কি পুরো ব্লক লিখতে পারি?"

"হ্যাঁ, এটি পরীক্ষা করে দেখুন:"

আউটপুট স্ট্রিম পদ্ধতি পদ্ধতি কি করে
void write(int c);
এই পদ্ধতি এক বাইট লিখে। int টাইপ একটি বাইট সংকীর্ণ করা হয়. অতিরিক্ত অংশ সহজভাবে বাতিল করা হয়.
void write(byte[] buff);
এই পদ্ধতিটি বাইটের একটি ব্লক লেখে।
void write(byte[] buff, int from, int count);
এই পদ্ধতিটি বাইটের একটি ব্লকের অংশ লেখে । এটি এমন ক্ষেত্রে ব্যবহৃত হয় যখন বাইট অ্যারে সম্পূর্ণরূপে পূরণ নাও হতে পারে।
void flush();
যদি স্ট্রীম অভ্যন্তরীণভাবে এমন কোনও ডেটা সংরক্ষণ করে যা এখনও লেখা হয়নি, এই পদ্ধতিটি এটি লিখতে বাধ্য করে।
void close();
এই পদ্ধতিটি প্রবাহকে "বন্ধ" করে। আপনি যখন স্ট্রীমের সাথে কাজ শেষ করেন তখন আপনি এটিকে কল করেন।
বস্তুটি তখন ফাইলটি বন্ধ করার জন্য প্রয়োজনীয় হাউসকিপিং ক্রিয়াকলাপগুলি সম্পাদন করে, ইত্যাদি। আপনি আর স্ট্রীমে ডেটা লিখতে পারবেন না, এবং ফ্লাশ স্বয়ংক্রিয়ভাবে বলা হয়।

"ফাইল অনুলিপি করার কোডটি কেমন হবে যদি আমরা একক বাইটের পরিবর্তে একবারে পুরো ব্লক পড়ি?"

"হুম। এরকম কিছু:"

ডিস্কে একটি ফাইল কপি করুন
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"আমি বাফার সম্পর্কে সবকিছু বুঝতে পারি, কিন্তু এই গণনা পরিবর্তনশীল কি?"

"যখন আমরা একটি ফাইল থেকে ডেটার সর্বশেষ ব্লকটি পড়ি, তখন আমরা 1000 এর পরিবর্তে 328 বাইট পেতে পারি। তাই যখন আমরা ডেটা লিখি, তখন আমাদের বোঝাতে হবে যে আমরা সম্পূর্ণ ব্লক লিখছি না - শুধুমাত্র প্রথম 328টি বাইট।"

যখন আমরা শেষ ব্লকটি পড়ি, তখন পঠন পদ্ধতিটি আসলে পড়া বাইটগুলির সংখ্যা ফেরত দেবে। 1000 প্রতিবার আমরা একটি ব্লক পড়ি, শেষ ব্লক বাদে, যখন আমরা 328 পাই।

সুতরাং যখন আমরা একটি ব্লক লিখি, তখন আমরা নির্দেশ করি যে বাফারের সমস্ত বাইট লেখা উচিত নয়, শুধুমাত্র 328 (অর্থাৎ কাউন্ট ভেরিয়েবলে সংরক্ষিত মান)।

"এখন সব পরিষ্কার। ধন্যবাদ, এলি।"