1. InputStreamReader
ক্লাস
স্ট্রীমগুলির আরেকটি আকর্ষণীয় বৈশিষ্ট্য হল যে আপনি একাধিক স্ট্রীমকে একসাথে চেইনে একত্রিত করতে পারেন । একটি স্ট্রীম শুধুমাত্র তার অভ্যন্তরীণ ডেটা উৎস থেকে নয়, অন্য স্ট্রিম থেকেও ডেটা পড়তে পারে ।
এটি জাভাতে একটি অত্যন্ত শক্তিশালী প্রক্রিয়া, যা একটি স্ট্রীমের সাথে অন্য স্ট্রিমকে সংযুক্ত করে জটিল ডেটা পড়ার দৃশ্য তৈরি করা সম্ভব করে তোলে। এই ধরনের একটি স্কিম এই মত দেখায়:
যখন একটি প্রোগ্রাম একটি ডেটা স্ট্রিম থেকে ডেটা পড়ে, তখন ডেটা স্ট্রীমটি তার ডেটা উত্স থেকে ডেটা পড়ে, যা অন্য ডেটা স্ট্রিম বা একটি ফাইল, উদাহরণস্বরূপ।
আরও কি, প্রতিটি ডেটা স্ট্রীম কেবল ডেটা পড়ে এবং দেয় না, তবে এটিকে রূপান্তর করতে বা এতে বিভিন্ন ক্রিয়াকলাপ সম্পাদন করতে পারে। এই ধরনের একটি "ইন্টারমিডিয়েট স্ট্রিম" এর একটি ভালো উদাহরণ হল InputStreamReader
ক্লাস।
আমরা ইতিমধ্যে একটি ক্লাস জানি FileReader
- এটি Reader
একটি ফাইল থেকে ডেটা পাঠ করে। এবং InputStreamReader
এর ডেটা কোথা থেকে পাওয়া যায়? এটা ঠিক - একটি থেকে InputStream
.
আপনি যখন একটি অবজেক্ট তৈরি করেন , তখন আপনাকে একটি অবজেক্ট বা এর কোনো একটি ডিসেন্ড্যান্ট ক্লাসে InputStreamReader
পাস করতে হবে । InputStream
উদাহরণ:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
ক্লাসে ক্লাসের InputStreamReader
সমস্ত পদ্ধতি রয়েছে Reader
এবং তারা ঠিক একইভাবে কাজ করে।
ক্লাসের মধ্যে প্রধান পার্থক্য InputStreamReader
এবং, বলুন, FileReader
তারা কোথা থেকে ডেটা পড়ে। FileReader
একটি ফাইল থেকে ডেটা পড়ে (duh — তাই এটিকে বলা হয় FileReader
), কিন্তু InputStreamReader
একটি থেকে ডেটা পড়ে InputStream
।
FileReader
আপনি যখন পদ্ধতিটি ব্যবহার করে একটি অবজেক্ট থেকে একটি অক্ষর পড়েন read()
, তখন এটি ডিস্কের ফাইল থেকে দুটি বাইট পড়ে এবং তাদের হিসাবে ফেরত দেয় chars
।
InputStreamReader
আপনি যখন পদ্ধতিটি ব্যবহার করে একটি অবজেক্ট থেকে একটি অক্ষর পড়েন read()
, তখন এটি FileInputStream
তার কাছে পাস করা বস্তু থেকে দুটি বাইট পড়ে, যা ফলস্বরূপ ফাইল থেকে ডেটা পড়ে। ফলাফল পদ্ধতি কল একটি শৃঙ্খল হয়read()
.
2. BufferedReader
ক্লাস
আরেকটি আকর্ষণীয় ক্লাস যা আপনি সম্ভবত অনেক ব্যবহার করতে পারেন BufferedReader
। এটি একটি "মধ্যবর্তী স্ট্রীম" যা অন্য স্ট্রিম থেকে ডেটা পড়ে।
এর নাম অনুসারে, BufferedReader
ক্লাসটি একটি সাবক্লাস Reader
এবং আপনাকে অক্ষর পড়তে দেয় । তবে সবচেয়ে মজার বিষয় হল আপনাকে এটিকে একটি স্ট্রীমের আকারে একটি ডেটা উত্স পাস করতে হবে যেখান থেকে অক্ষরগুলি পড়া যেতে পারে , যেমন একটি স্ট্রীম যা Reader
ক্লাসের উত্তরাধিকারী হয়৷
আলোচ্য বিষয়টি কি? ভিন্ন InputStreamReader
, BufferedReader
ক্লাস বাইটকে অক্ষরে রূপান্তর করে না: এটি কিছুতেই রূপান্তর করে না। পরিবর্তে, এটি ডেটা বাফার করে ।
যখন একটি প্রোগ্রাম একটি BufferedReader
অবজেক্ট থেকে একটি একক অক্ষর পড়ে, তখন অবজেক্টটি তার উৎস স্ট্রীম থেকে একযোগে একটি বড় অ্যারের অক্ষর পড়ে। এবং তাদের অভ্যন্তরীণভাবে সংরক্ষণ করে।
যখন পরবর্তী অক্ষরটি অবজেক্ট থেকে পড়া হয় BufferedReader
, তখন এটি কেবল তার অভ্যন্তরীণ বাফার অ্যারে থেকে পরবর্তী অক্ষরটিকে ধরে নেয় এবং ডেটা উত্স অ্যাক্সেস না করেই এটি ফেরত দেয়। শুধুমাত্র যখন বাফারের সমস্ত অক্ষর ব্যবহার করা হয় তখন এটি অক্ষরের আরেকটি বড় অ্যারেতে পড়ে।
ক্লাসের BufferedReader
একটি খুব দরকারী পদ্ধতিও রয়েছে — String readLine()
, যা আপনাকে সোর্স স্ট্রিম থেকে ডেটার সম্পূর্ণ স্ট্রিং একবারে পড়তে দেয়। আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন, বলুন, একটি ফাইল পড়তে এবং এর বিষয়বস্তু স্ক্রীনে লাইনে লাইনে প্রদর্শন করতে পারেন। উদাহরণ:
এটি কতটা সুবিধাজনক হতে পারে তা বোঝাতে আমরা বিশেষভাবে কিছু কমপ্যাক্ট কোড লিখেছি। এই কোডটি আরও একটু বিস্তারিতভাবে লেখা যেতে পারে।
|
একটি FileReader বস্তু তৈরি করুন। তথ্য উৎস একটি ফাইল. একটি BufferedReader বস্তু তৈরি করুন। তথ্য উৎস হল একটি FileReader . যতক্ষণ রিডারে ডেটা থাকে ততক্ষণ একটি লাইন পড়ুন লাইনটি প্রদর্শন করুন |
আপনি যদি একাধিক স্ট্রীম একসাথে চেইন করেন, তবে close()
পদ্ধতিটি শুধুমাত্র তাদের মধ্যে একটিতে কল করা দরকার। close()
চূড়ান্ত ডেটা স্ট্রীমে কল না হওয়া পর্যন্ত সেই স্ট্রীমটি তার ডেটা উত্সে পদ্ধতিটিকে কল করবে, এবং তাই ।
3. কনসোল থেকে পড়া
এবং আরও একটি আকর্ষণীয় তথ্য: Scanner
ক্লাসটি একটি মধ্যবর্তী ইনপুট স্ট্রিম ছাড়া আর কিছুই নয় যা থেকে ডেটা পড়ে System.in
, যা একটি ডেটা স্ট্রিমও।
কনসোল থেকে একটি লাইন পড়ার দুটি উপায় এখানে রয়েছে:
স্ক্যানার ক্লাস | বাফারডরিডার এবং বাফারডরাইটার ক্লাস |
---|---|
|
|
আমাদের বন্ধু ক্লাসের একটি স্ট্যাটিক পরিবর্তনশীল ছাড়া আর কিছুই নয় । এটি একটি যার নাম ।System.in
in
System
InputStream
in
তাই কোডজিমে আপনার জাভা অধ্যয়নের শুরু থেকেই, আপনি ডেটা স্ট্রীম নিয়ে কাজ করছেন এবং তাদের থেকে চেইন তৈরি করছেন। তবে এখন আপনি এটি আরও সচেতনভাবে করবেন।