"হাই, অ্যামিগো!"

"হাই, এলি!"

"আজ আমরা I/O স্ট্রীম অধ্যয়ন করতে যাচ্ছি।"

"হ্যাঁ, আমি ইতিমধ্যে তাদের সম্পর্কে সবকিছু জানি। আমরা এখানে FileInputStream এবং FileOutputStream ক্লাস ব্যবহার করি।"

"হ্যাঁ, এবং এই ক্লাসের কোন পদ্ধতি আপনি জানেন?"

"অবশ্যই। এখানে FileInputStream এর পদ্ধতি আছে:"

পদ্ধতি বর্ণনা
int read() এক বাইট পড়ে এবং ফেরত দেয়।
int read(byte b[]) একটি বাইট অ্যারে পড়ে এবং এটি ফেরত দেয়।
int read(byte b[], int off, int len) স্ট্রীম থেকে একটি বাইট অ্যারে পড়ে।
long skip(long n) এড়িয়ে যায় n বাইট, স্ট্রীম থেকে পড়ার সময় ব্যবহৃত হয়।
int available() স্ট্রীম থেকে এখনও পড়া যায় এমন বাইটের সংখ্যা প্রদান করে।
void close() প্রবাহ বন্ধ করে দেয়।

"স্পট অন! এবং ফাইলআউটপুটস্ট্রিমের পদ্ধতি?"

"এক নজর দেখে নাও:"

পদ্ধতি বর্ণনা
void write(int b) স্রোতে এক বাইট লেখে।
void write(byte b[]) স্ট্রীমে বাইটের একটি অ্যারে লেখে।
void write(byte b[], int off, int len) স্ট্রীমে বাইটের একটি অ্যারে লেখে।
void close() প্রবাহ বন্ধ করে দেয়।

"আমিগো, তুমি আমাকে অবাক করে দাও!"

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

"ঠিক আছে, তাহলে আমি আপনাকে দুটি নতুন ক্লাস দেব: ZipInputStream এবং ZipOutputStream।"

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" জিপ ? এটা কি জিপ ফাইলের মত?"

"ঠিক। এই স্ট্রীমগুলো জিপ ফাইলের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে। আপনি এগুলিকে সরাসরি একটি জিপ ফাইলে পড়তে বা লিখতে ব্যবহার করতে পারেন!"

"পবিত্র মলি! কত মজার। কিন্তু একটি জিপ ফাইলে একটি ফাইল নয়, একাধিক ফাইল থাকতে পারে। তারা কিভাবে কাজ করে?"

"এর জন্য, আরেকটি বিশেষ শ্রেণী রয়েছে: ZipEntry । এটি সংরক্ষণাগারে সংরক্ষিত একটি ফাইল উপস্থাপন করে। আপনি শুধুমাত্র ZipInputStream থেকে ZipEntry অবজেক্ট পড়তে পারবেন, এবং আপনি ZipOutputStream- এ শুধুমাত্র ZipEntry অবজেক্ট লিখতে পারবেন । কিন্তু দেখা যাচ্ছে যে আপনি পড়তে পারেন এবং একটি নিয়মিত ফাইলের মতো একটি ZipEntry এ লিখুন ।"

"আপনি কি আমাকে এটি কীভাবে কাজ করে তার একটি উদাহরণ দিতে পারেন?"

"অবশ্যই। এখানে একটি উদাহরণ যেখানে আমরা একটি সংরক্ষণাগার তৈরি করি এবং এতে একটি ফাইল রাখি:"

কোড
// Create an archive
FileOutputStream zipFile = new FileOutputStream("c:/archive.zip");
ZipOutputStream zip = new ZipOutputStream(zipFile);

//Put a ZipEntry into it
zip.putNextEntry(new ZipEntry("document.txt"));

//Copy the file «document-for-archive.txt» to the archive under the name «document.txt»
File file = new File("c:/document-for-archive.txt");
Files.copy(file.toPath(), zip);

// Close the archive
zip.close();

"কত আকর্ষণীয়! এবং ফাইল আনজিপ করা ঠিক ততটাই সহজ?"

"হ্যাঁ। এখানে ZipEntry , ZipInputStream   এবং ZipOutputStream ক্লাসের পদ্ধতিগুলির একটি সংক্ষিপ্ত বিবরণ রয়েছে "

" ZipInputStream একটি স্ট্রীম, তাই সমস্ত ZipEntry শুধুমাত্র ক্রমানুসারে পড়া যায়। এখানে এর পদ্ধতিগুলি রয়েছে:"

পদ্ধতি বর্ণনা
ZipEntry getNextEntry() পরবর্তী ZipEntry বর্ণনা করে একটি বস্তু ফেরত দেয় (বর্তমান এন্ট্রির সমস্ত বাইট এড়িয়ে যায়)।
void closeEntry() বর্তমান ZipEntry এ ইনপুট স্ট্রীম বন্ধ করে (বর্তমান এন্ট্রিতে সমস্ত বাইট এড়িয়ে যায়)।
int available() রিটার্ন 1 সেখানে ZipEntry উপলব্ধ আছে, অন্যথায় 0।
int read(byte[] b, int off, int len) বর্তমান ZipEntry থেকে বাইট পড়ে।
long skip(long n) স্ট্রীম থেকে পড়ার সময় n বাইট এড়িয়ে যায়।
void close() প্রবাহ বন্ধ করে দেয়।

"আমি সত্যিই বুঝতে পারছি না।"

"সর্বোত্তম জিনিসটি হল কল্পনা করুন যে আপনি একটি টেক্সট ফাইল পড়ছেন, এবং ZipEntryগুলি ফাইলের লাইনের মতো। আপনি বর্তমান লাইন (বর্তমান ZipEntry ) থেকে ডেটা পড়তে পারেন বা লাইন থেকে লাইনে যেতে পারেন ( getNextEntry , closeEntry ) "

"আমি মনে করি আমি বুঝতে পেরেছি, কিন্তু আমি নিশ্চিত নই।"

"এখানে ZipOutputStream এবং এর পদ্ধতি:"

পদ্ধতি বর্ণনা
void setComment(String comment) সংরক্ষণাগারে একটি মন্তব্য সেট করে।
void setMethod(int method) কম্প্রেশন পদ্ধতি (টাইপ) সেট করে।
void setLevel(int level) কম্প্রেশন লেভেল সেট করে। কম্প্রেশন যত বেশি হবে, তত ধীরগতির হবে।
void putNextEntry(ZipEntry e) একটি নতুন ZipEntry যোগ করে।
void closeEntry() বর্তমান ZipEntry বন্ধ করে
void write(byte[] b, int off, int len) বর্তমান ZipEntry এ বাইটের একটি সেট লেখে।
void close() প্রবাহ বন্ধ করে দেয়।

"কিন্তু উপরের উদাহরণে আমরা এর প্রায় কিছুই ব্যবহার করিনি।"

"এগুলি ঐচ্ছিক পদ্ধতি। আপনাকে কম্প্রেশন স্তর এবং পদ্ধতি নির্দিষ্ট করতে হবে না-ডিফল্ট সেটিংস ব্যবহার করা হবে।"

"হুম। এত খারাপ না। আর জিপএন্ট্রি?"

"অবশ্যই। একটি ZipEntry-তে একমাত্র অন্য তথ্য হল গৃহস্থালির তথ্য:"

পদ্ধতি বর্ণনা
String getName(), setName(String) অভ্যন্তরীণ নামের ফাইল।
long getTime(), setTime(long) গতবার এন্ট্রি পরিবর্তন করা হয়েছিল।
long getCRC(), setCRC(long) চেকসাম।
long getSize(), setSize(long) কম্প্রেশন আগে আকার.
int getMethod(), setMethod(int) কম্প্রেশন পদ্ধতি.
long get/setCompressedSize() জিপ করার পরে আকার।
boolean isDirectory() এন্ট্রি একটি ডিরেক্টরি?

"এটা খুব কঠিন মনে হচ্ছে না। ভালোবাসার কি নেই!"

"চমৎকার, তাহলে ডিয়েগো আপনাকে এই বিষয়েও কাজ দেবে।"

"আমার মুখ বন্ধ রাখা উচিত ছিল।"