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

এগুলি খুব আকর্ষণীয় ইন্টারফেস। আপাতত, আমি ইচ্ছাকৃতভাবে তাদের ইন্টারফেস কল করতে যাচ্ছি , তাই আপনি বুঝতে পারছেন কেন আমাদের তাদের প্রয়োজন। এবং তারপর আমরা আলোচনা করব কেন তারা আসলে বিমূর্ত ক্লাস।

"ঠিক আছে। তাহলে এই ইন্টারফেসগুলো কি?"

"আমি আর কোন ঝামেলা ছাড়াই বলব।"

জাভাতে একটি " স্ট্রিম " নামক এই আকর্ষণীয় জিনিস রয়েছে । একটি স্রোত একটি খুব সহজ সত্তা. এবং এর সরলতা ডেটা আদান-প্রদানের একটি অত্যন্ত শক্তিশালী উপায়ের চাবিকাঠি। দুই ধরনের ধারা আছে: পড়ার জন্য প্রবাহ এবং লেখার জন্য প্রবাহ

আপনি সম্ভবত ইতিমধ্যে অনুমান করেছেন, আপনি লেখার জন্য একটি স্ট্রীমে ডেটা লিখতে পারেন । এটির জন্য একটি লেখার পদ্ধতি রয়েছে । আপনি পড়ার জন্য একটি স্ট্রিম থেকে ডেটা পড়তে পারেন । এটির জন্য একটি read () পদ্ধতি রয়েছে ।

ইনপুটস্ট্রিম  হল একটি স্ট্রিমের ইন্টারফেস যা পড়া সমর্থন করে। এটি নিম্নলিখিত ক্ষমতা সংজ্ঞায়িত করে: "বাইটগুলি আমার কাছ থেকে পড়া যেতে পারে"।

একইভাবে, আউটপুট স্ট্রীম , একটি আউটপুট স্ট্রিম একটি স্ট্রিমের জন্য একটি ইন্টারফেস যা লেখাকে সমর্থন করে। এটি নিম্নলিখিত ক্ষমতা সংজ্ঞায়িত করে: "বাইট আমার কাছে লেখা যেতে পারে"।

"এটাই?"

"বেশ অনেক। কিন্তু পুরো বিষয় হল জাভাতে প্রচুর ক্লাস রয়েছে যা ইনপুটস্ট্রিম এবং আউটপুটস্ট্রিমের সাথে কাজ করতে পারে । উদাহরণস্বরূপ, আপনি ডিস্ক থেকে একটি ফাইল পড়তে চান এবং তার বিষয়বস্তু স্ক্রিনে প্রদর্শন করতে চান। কিছুই সহজ হতে পারে না।"

ডিস্কের একটি ফাইল থেকে ডেটা পড়ার জন্য, আমাদের কাছে বিশেষ FileInputStream ক্লাস আছে, যা InputStream ইন্টারফেস প্রয়োগ করে। আপনি অন্য ফাইল এই তথ্য লিখতে চান? এর জন্য, আমাদের কাছে FileOutputStream ক্লাস আছে, যা আউটপুট স্ট্রিম ইন্টারফেস প্রয়োগ করে। একটি ফাইল থেকে অন্য ফাইলে ডেটা কপি করার জন্য আপনাকে কী করতে হবে তা নিম্নলিখিত কোডটি দেখায়।

কোড
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

কল্পনা করুন যে আমরা একটি ক্লাস লিখেছি এবং  এতে ইনপুটস্ট্রিম  এবং  আউটপুট স্ট্রিম ক্ষমতা যুক্ত করেছি।

যদি আমরা এই ইন্টারফেসগুলিকে সঠিকভাবে প্রয়োগ করি, তাহলে আমাদের ক্লাসের উদাহরণগুলি এখন একটি ফাইলে সংরক্ষণ করা বা পড়তে পারে। শুধুমাত্র পঠন পদ্ধতি ব্যবহার করে তাদের বিষয়বস্তু পড়ার মাধ্যমে। অথবা সেগুলি একটি ফাইল থেকে লোড করা যেতে পারে একটি অবজেক্ট তৈরি করে এবং ফাইলের বিষয়বস্তু লেখার জন্য লেখার পদ্ধতি ব্যবহার করে ।

"হয়তো একটা উদাহরণ?"

"অবশ্যই।"

কোড বর্ণনা
class MyClass
{
private ArrayList<Integer> list;
}
সরলতার জন্য, কল্পনা করুন যে আমাদের ক্লাসে একটি বস্তু রয়েছে, একটি অ্যারেলিস্ট যা পূর্ণসংখ্যা ধারণ করে।

এখন আমরা এটিতে রিড এবং রাইট পদ্ধতি যোগ করব

কোড বর্ণনা
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
এখন আমাদের শ্রেণী পঠন পদ্ধতি প্রয়োগ করে, যা তালিকার সম্পূর্ণ বিষয়বস্তু ক্রমানুসারে পড়া সম্ভব করে তোলে ।

এবং লেখার পদ্ধতি, যা আপনাকে আমাদের তালিকায় মান লিখতে দেয়।

অবশ্যই, এটি ইনপুটস্ট্রিম এবং আউটপুটস্ট্রিম ইন্টারফেসের বাস্তবায়ন নয়, তবে এটি খুব একই রকম।

"হ্যাঁ, আমি বুঝতে পেরেছি। তাহলে আপনি কিভাবে একটি ফাইলে এই ধরনের বস্তুর বিষয়বস্তু সংরক্ষণ করবেন?"

"আমাকে যদি আপনি একটি উদাহরণ দিতে:"

একটি ফাইলে একটি মাইক্লাস অবজেক্ট লিখুন
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
একটি ফাইল থেকে একটি MyClass অবজেক্ট পড়ুন
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

"হলি মলি! এটি সত্যিই ইনপুটস্ট্রিম/আউটপুটস্ট্রিমের সাথে কাজ করার মতোই। স্ট্রীমগুলি মিষ্টি!"

"এবং তারপর কিছু!"