"হ্যালো, অ্যামিগো! আজ আমরা ইনপুট/আউটপুট স্ট্রীমগুলির সাথে পরিচিত হব । আমরা কয়েকদিন আগে এই বিষয়টি বেছে নিয়েছিলাম, কিন্তু আজ আমরা এটি পুঙ্খানুপুঙ্খভাবে অন্বেষণ করব। ইনপুট/আউটপুট স্ট্রীমগুলিকে 4টি বিভাগে বিভক্ত করা হয়েছে:"

1) স্ট্রীমগুলি তাদের দিক অনুসারে বিভক্ত: ইনপুট স্ট্রীম এবং আউটপুট স্ট্রীম

2) স্ট্রীমগুলিকে তাদের ডেটা টাইপ অনুসারে ভাগ করা হয়েছে: যেগুলি বাইটগুলির সাথে কাজ করে এবং যেগুলি অক্ষরগুলির সাথে কাজ করে ৷

এখানে এই বিভাগগুলি একটি টেবিলে উপস্থাপন করা হয়েছে:

ইনপুট স্ট্রিম আউটপুট স্ট্রীম
বাইট দিয়ে কাজ করে ইনপুট স্ট্রিম আউটপুট স্ট্রিম
অক্ষর নিয়ে কাজ করে পাঠক লেখক

যদি কোনো বস্তু ইনপুটস্ট্রিম ইন্টারফেস প্রয়োগ করে, তাহলে এটি থেকে ক্রমানুসারে বাইট পড়ার ক্ষমতা সমর্থন করে।

যদি একটি বস্তু আউটপুটস্ট্রিম ইন্টারফেস প্রয়োগ করে, তাহলে এটি ক্রমানুসারে বাইট লেখার ক্ষমতা সমর্থন করে।

যদি কোনো বস্তু রিডার ইন্টারফেস প্রয়োগ করে, তাহলে এটি থেকে ক্রমানুসারে অক্ষর (অক্ষর) পড়ার ক্ষমতা সমর্থন করে।

যদি একটি বস্তু রাইটার ইন্টারফেস প্রয়োগ করে, তাহলে এটি ক্রমানুসারে এটিতে অক্ষর (অক্ষর) লেখার ক্ষমতা সমর্থন করে।

ইনপুট/আউটপুট স্ট্রীম - 1

একটি আউটপুট স্ট্রিম একটি প্রিন্টারের মত। আমরা প্রিন্টারে নথি আউটপুট করতে পারি। আমরা আউটপুট স্ট্রীমে ডেটা আউটপুট করতে পারি।

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

"তারা কোথায় ব্যবহার করা হয়?"

"এই ক্লাসগুলি জাভাতে সর্বত্র ব্যবহৃত হয়। আমাদের পরিচিত বন্ধু System.in হল একটি স্ট্যাটিক ইনপুটস্ট্রিম ভেরিয়েবল যার নাম সিস্টেম ক্লাসে ।"

"গম্ভীরভাবে?! তাই এই সমস্ত সময় আমি একটি ইনপুটস্ট্রিম ব্যবহার করছি এবং এটি বুঝতেও পারিনি। System.outও কি একটি স্ট্রীম?"

"হ্যাঁ, System.out হল সিস্টেম ক্লাসের একটি স্ট্যাটিক প্রিন্টস্ট্রিম ( আউটপুটস্ট্রিমের একটি বংশধর) পরিবর্তনশীল।"

"আপনি আমাকে বলতে চাচ্ছেন যে আমি সবসময় স্ট্রীম ব্যবহার করছি এবং এমনকি এটি জানতাম না?"

"হ্যাঁ, এবং এটি কেবল আমাদের বলে যে এই স্ট্রিমগুলি কতটা সুবিধাজনক। আপনি শুধু একটি ধরুন এবং এটি ব্যবহার করুন।"

"কিন্তু আপনি System.in সম্পর্কে এটি বলতে পারেন না। আমাদের ক্রমাগত এটিতে বাফারডরিডার বা ইনপুটস্ট্রিমরিডার যোগ করতে হয়েছিল।"

"এটা সত্যি। কিন্তু এর কারণও ছিল।"

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

তবে আপনি এই অংশগুলিকে একটি সুসংগত উপায়ে সংযুক্ত করতে পারেন এবং আপনার প্রয়োজন হলে খুব জটিল কার্যকারিতা পেতে পারেন। এই উদাহরণ দেখুন:

কনসোলে একটি স্ট্রিং আউটপুট করুন
System.out.println("Hello");
কনসোল আউটপুট স্ট্রীম একটি পৃথক ভেরিয়েবলে সংরক্ষণ করুন।
প্রবাহে একটি স্ট্রিং আউটপুট করুন।
PrintStream console = System.out;
console.println("Hello");
মেমরিতে একটি গতিশীল (প্রসারিত) বাইট অ্যারে তৈরি করুন।
এটিকে একটি নতুন আউটপুট স্ট্রীমের সাথে সংযুক্ত করুন (প্রিন্টস্ট্রিম অবজেক্ট)।
প্রবাহে একটি স্ট্রিং আউটপুট করুন।
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"সত্যি বলতে, এটি একটি লেগো সেটের মতো। শুধুমাত্র এটি আমার কাছে পরিষ্কার নয় যে এই কোডের কোনটি কি করছে।"

"এটা নিয়ে আপাতত চিন্তা করবেন না। সবকিছু তার নিজের নির্ধারিত সময়ে।"

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

"ঠিক আছে। তাহলে কোথা থেকে শুরু করব?"