Java Zip বা ফাইল কম্প্রেশন একটি গুরুত্বপূর্ণ প্রযুক্তি, যা Java অ্যাপ্লিকেশনগুলিতে ফাইলের আকার কমানোর জন্য ব্যবহৃত হয়। ZipOutputStream ব্যবহার করে Java তে ফাইল কম্প্রেস করা যেতে পারে। এটি একটি ক্লাস যা Java API তে java.util.zip প্যাকেজে অন্তর্ভুক্ত এবং এটি ফাইল বা ডেটাকে ZIP ফরম্যাটে কম্প্রেস করার জন্য ব্যবহৃত হয়।
ZipOutputStream এর মাধ্যমে ফাইল Compress করা:
ZipOutputStream ফাইল কম্প্রেস করতে এবং একটি ZIP ফাইল তৈরি করতে ব্যবহৃত হয়। এটি সাধারণত FileOutputStream এর সাথে একত্রিত করা হয়, যাতে কম্প্রেসড ফাইলটি একটি ফিজিক্যাল ফাইল হিসেবে সিস্টেমে সংরক্ষণ করা যায়।
এখানে একটি উদাহরণ দেওয়া হলো, যেখানে একটি বা একাধিক ফাইলকে ZIP ফাইলে কম্প্রেস করা হচ্ছে।
Java ZipOutputStream উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) {
String zipFileName = "example.zip"; // ZIP ফাইলের নাম
String[] filesToZip = {"file1.txt", "file2.txt", "file3.txt"}; // ফাইলের নাম যেগুলো কম্প্রেস করতে হবে
try {
// FileOutputStream ব্যবহার করে ZIP ফাইল তৈরি
FileOutputStream fos = new FileOutputStream(zipFileName);
// ZipOutputStream ব্যবহার করে ফাইল কম্প্রেস করা
ZipOutputStream zos = new ZipOutputStream(fos);
for (String fileName : filesToZip) {
// নতুন ZipEntry তৈরি করা (এটি ZIP ফাইলের একটি এন্ট্রি)
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file.getName());
// ZipEntry যোগ করা
zos.putNextEntry(zipEntry);
// ফাইল ডেটা ZIP ফাইলে লিখে রাখা
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
// বর্তমান এন্ট্রির জন্য ZipEntry সম্পূর্ণ করা
zos.closeEntry();
fis.close();
}
// ZipOutputStream এবং FileOutputStream বন্ধ করা
zos.close();
fos.close();
System.out.println("Files successfully compressed into " + zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
কোডের ব্যাখ্যা:
- ZipOutputStream এবং FileOutputStream:
- প্রথমে
FileOutputStreamব্যবহার করে একটি ZIP ফাইল তৈরি করা হয়। পরে সেই আউটপুট স্ট্রিমেZipOutputStreamযুক্ত করা হয়, যা ফাইলগুলিকে কম্প্রেস করে একটি ZIP ফাইলে লেখে।
- প্রথমে
- ZipEntry:
ZipEntryহল একটি কন্টেইনার যা একটি ফাইলকে ZIP আর্কাইভে সংরক্ষিত করে। প্রতিটি ফাইলকেZipEntryহিসেবে ZIP আর্কাইভে যোগ করা হয়।
- FileInputStream:
- প্রতিটি ফাইলের জন্য
FileInputStreamতৈরি করা হয়, যা ফাইলের ডেটা পড়তে সাহায্য করে। পরে এই ডেটাZipOutputStreamএর মাধ্যমে ZIP ফাইলে লেখা হয়।
- প্রতিটি ফাইলের জন্য
- Buffering:
byte[] buffer = new byte[1024];লাইনটি ব্যবহার করে ফাইলের ডেটা একবারে ১ কিলোবাইট করে কম্প্রেস করা হয়, যা মেমরি ব্যবস্থাপনাকে আরও কার্যকরী করে।
- Close Entry and Stream:
- প্রতিটি
ZipEntryপ্রক্রিয়া করার পরzos.closeEntry()কল করা হয়, যাতে পরবর্তী এন্ট্রি শুরু করা যায়। অবশেষে,zos.close()এবংfos.close()ব্যবহার করে স্ট্রিমগুলি বন্ধ করা হয়।
- প্রতিটি
ফলাফল:
এটি একটি example.zip নামক ZIP ফাইল তৈরি করবে যা file1.txt, file2.txt, এবং file3.txt ফাইলগুলি কম্প্রেস করবে।
এছাড়াও কিছু গুরুত্বপূর্ণ বিষয়:
Compression Level: Java
ZipOutputStreamস্বাভাবিকভাবে Deflate কম্প্রেশন স্ট্র্যাটেজি ব্যবহার করে। আপনি কম্প্রেশন লেভেল সেট করতে পারেন:zos.setLevel(Deflater.BEST_COMPRESSION); // অথবা Deflater.DEFAULT_COMPRESSION- Multiple Files: একটি ZIP ফাইলে একাধিক ফাইল যোগ করা যায় এবং এতে ফোল্ডার স্ট্রাকচারও সংরক্ষণ করা যায়।
- Directories: যদি একটি ডিরেক্টরি এবং তার ফাইলগুলো জিপ করতে চান, তবে ডিরেক্টরি কম্প্রেস করার সময় তার নাম
ZipEntryহিসেবে নির্দিষ্ট করতে হবে।
ZipOutputStream ব্যবহার করে Java তে ফাইল কম্প্রেস করা একটি সরল এবং কার্যকরী উপায়। এটি বিভিন্ন ফাইল এবং ডিরেক্টরি কম্প্রেস করতে সাহায্য করে এবং Java অ্যাপ্লিকেশনগুলিতে ফাইল সঞ্চয় এবং ডিস্ট্রিবিউশন আরও সহজ করে তোলে।
ZipOutputStream Java তে একটি ক্লাস যা ZIP ফাইল তৈরি করতে ব্যবহৃত হয়। এটি java.util.zip প্যাকেজের অংশ এবং আপনি এই ক্লাস ব্যবহার করে একটি বা একাধিক ফাইল বা ডিরেক্টরি ZIP আর্কাইভ ফরম্যাটে কমপ্রেস করতে পারেন। এই ক্লাসটি ZIP ফাইল তৈরির জন্য আউটপুট স্ট্রীম হিসেবে কাজ করে, যার মাধ্যমে ফাইলগুলিকে ZIP ফরম্যাটে কমপ্রেস করা হয় এবং একত্রে সংরক্ষণ করা হয়।
ZipOutputStream কী?
ZipOutputStream হলো একটি আউটপুট স্ট্রীম যা ZIP আর্কাইভ ফাইল তৈরি করতে ব্যবহৃত হয়। এটি অন্যান্য আউটপুট স্ট্রীমের সাথে কাজ করে (যেমন FileOutputStream), কিন্তু ফাইলগুলিকে কমপ্রেস করে সংরক্ষণ করার সুবিধা প্রদান করে। এর মাধ্যমে একাধিক ফাইল বা ডিরেক্টরি একটি একক ZIP ফাইলে সংরক্ষণ করা যায়।
ZipOutputStream কিভাবে কাজ করে?
ZipOutputStream ক্লাসটি output stream হিসেবে কাজ করে, যার মাধ্যমে আপনি নির্দিষ্ট ফাইলগুলো কমপ্রেস এবং ZIP আর্কাইভে লিখতে পারেন। এটি ZIP আর্কাইভ ফাইলের মধ্যে একাধিক Entry তৈরি করে, যেখানে প্রতিটি Entry একটি ফাইল বা ডিরেক্টরি উপস্থাপন করে।
ZipOutputStream এর মূল কাজ হলো:
- ZIP ফাইল তৈরি করা।
- ফাইলগুলি কমপ্রেস করে আর্কাইভে সংরক্ষণ করা।
- একটি বা একাধিক ফাইলকে একটি একক ZIP ফাইলের মধ্যে রেখে একটি স্ট্যান্ডার্ড আর্কাইভ ফাইল তৈরি করা।
ZipOutputStream ব্যবহার করার পদক্ষেপ:
- FileOutputStream তৈরি করুন: প্রথমে, একটি
FileOutputStreamতৈরি করুন যা আউটপুট ফাইল নির্ধারণ করবে যেখানে ZIP ফাইলটি সংরক্ষিত হবে। - ZipOutputStream তৈরি করুন: এরপর,
ZipOutputStreamব্যবহার করেFileOutputStreamএর উপর ভিত্তি করে ZIP ফাইল তৈরি করুন। - ZipEntry তৈরি করুন: প্রতিটি ফাইল বা ডিরেক্টরি সংরক্ষণ করার জন্য
ZipEntryতৈরি করুন। প্রতিটিZipEntryএকটি ফাইলের জন্য রেপ্রেজেন্টেশন হিসেবে কাজ করবে। - ফাইল লেখা এবং কমপ্রেস করা: ফাইলের ডেটা
ZipOutputStreamএ লেখা হবে এবং এটি কমপ্রেসড অবস্থায় থাকবে। - Stream বন্ধ করা: কাজ শেষে
ZipOutputStreamএবংFileOutputStreamবন্ধ করতে হবে।
ZipOutputStream এর উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) {
try {
// ZIP ফাইল লেখার জন্য আউটপুট স্ট্রীম তৈরি
FileOutputStream fileOut = new FileOutputStream("output.zip");
ZipOutputStream zipOut = new ZipOutputStream(fileOut);
// প্রথম ফাইলের জন্য ZipEntry তৈরি
File file1 = new File("file1.txt");
FileInputStream fileInput1 = new FileInputStream(file1);
ZipEntry zipEntry1 = new ZipEntry(file1.getName());
zipOut.putNextEntry(zipEntry1);
// প্রথম ফাইলের কনটেন্ট লিখুন
byte[] buffer1 = new byte[1024];
int length1;
while ((length1 = fileInput1.read(buffer1)) > 0) {
zipOut.write(buffer1, 0, length1);
}
zipOut.closeEntry();
fileInput1.close();
// দ্বিতীয় ফাইলের জন্য ZipEntry তৈরি
File file2 = new File("file2.txt");
FileInputStream fileInput2 = new FileInputStream(file2);
ZipEntry zipEntry2 = new ZipEntry(file2.getName());
zipOut.putNextEntry(zipEntry2);
// দ্বিতীয় ফাইলের কনটেন্ট লিখুন
byte[] buffer2 = new byte[1024];
int length2;
while ((length2 = fileInput2.read(buffer2)) > 0) {
zipOut.write(buffer2, 0, length2);
}
zipOut.closeEntry();
fileInput2.close();
// ZipOutputStream বন্ধ করুন
zipOut.close();
fileOut.close();
System.out.println("ZIP ফাইল তৈরি করা হয়েছে: output.zip");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileOutputStream fileOut: প্রথমে আমরা
FileOutputStreamতৈরি করছি, যেখানেoutput.zipনামক ZIP ফাইলটি সংরক্ষিত হবে। - ZipOutputStream zipOut: এর মাধ্যমে আমরা
FileOutputStreamএর উপর ভিত্তি করে ZIP আর্কাইভ তৈরি করি। - ZipEntry zipEntry1, zipEntry2:
ZipEntryহলো একটি অবজেক্ট যা প্রতিটি ফাইল বা ডিরেক্টরির নাম এবং মেটাডেটা ধারণ করে। - zipOut.putNextEntry(zipEntry): এই মেথডটি একটি নতুন Entry আর্কাইভে যোগ করার জন্য ব্যবহার করা হয়।
- zipOut.write(buffer, 0, length): ফাইলের কনটেন্ট ZIP ফাইলে লেখা হয়।
- zipOut.closeEntry(): প্রতিটি ফাইলের জন্য এই মেথডটি কল করা হয়, যাতে সেই ফাইলটির লেখা শেষ হয়।
- zipOut.close(): সব ফাইল লেখা শেষে
ZipOutputStreamবন্ধ করতে হবে।
ZipOutputStream এর সুবিধাসমূহ:
- কমপ্রেসন: এটি ফাইলগুলিকে কমপ্রেস করে সংরক্ষণ করার সুবিধা দেয়, যার ফলে ডেটা সংরক্ষণে স্থান সাশ্রয় হয়।
- একাধিক ফাইলের একত্রিতকরণ: একাধিক ফাইল এবং ডিরেক্টরিকে একটি একক ZIP আর্কাইভে সংরক্ষণ করা সম্ভব।
- এন্টারপ্রাইজ অ্যাপ্লিকেশন: এটি বিশেষত ওয়েব অ্যাপ্লিকেশন, ফাইল শেয়ারিং, বা ডেটা ব্যাকআপ সিস্টেমে ব্যবহৃত হয়।
- Java ইন্টিগ্রেশন: অন্যান্য Java API এবং ফ্রেমওয়ার্কের সাথে সহজেই ইন্টিগ্রেট করা যায়।
ZipOutputStream এর সীমাবদ্ধতা:
- মেমরি ব্যবহারের সমস্যা: বড় ফাইল বা ডিরেক্টরি কমপ্রেস করার সময় মেমরি ব্যবহারের সমস্যা দেখা দিতে পারে। তবে, স্ট্রীমিং পার্সিং পদ্ধতি ব্যবহার করে এই সমস্যার সমাধান করা যেতে পারে।
- কমপ্রেসন এর গতি: কিছু ক্ষেত্রে, ZipOutputStream কমপ্রেসন প্রক্রিয়া ধীর হতে পারে, তবে এটি সাধারণত বড় ডেটার জন্য যথেষ্ট দ্রুত।
ZipOutputStream একটি শক্তিশালী Java ক্লাস যা ফাইলগুলোকে ZIP ফরম্যাটে সংরক্ষণ এবং কমপ্রেস করার জন্য ব্যবহৃত হয়। এটি Java প্রোগ্রামিং ভাষায় ডেটা সংরক্ষণের জন্য একটি গুরুত্বপূর্ণ সরঞ্জাম, বিশেষত যখন বড় বা একাধিক ফাইল কমপ্রেস করা দরকার।
Java তে একটি ফাইলকে ZIP ফাইলে রূপান্তর করার জন্য java.util.zip প্যাকেজ ব্যবহার করা হয়। এই প্যাকেজের মাধ্যমে ZIP ফাইল তৈরি করা এবং এক বা একাধিক ফাইলকে সেই ZIP ফাইলে সংযুক্ত করা যায়।
এখানে একটি উদাহরণ দেওয়া হলো, যা দেখাবে কিভাবে একটি বা একাধিক ফাইলকে ZIP ফাইলে রূপান্তর করা যায়।
ফাইলকে Zip ফাইলে রূপান্তর করার উদাহরণ
এই উদাহরণে, file1.txt এবং file2.txt নামে দুটি টেক্সট ফাইলকে একটি archive.zip নামে ZIP ফাইলে রূপান্তর করা হবে।
import java.io.*;
import java.util.zip.*;
public class ZipFileExample {
public static void main(String[] args) {
// আউটপুট ZIP ফাইলের নাম
String zipFileName = "archive.zip";
// যে ফাইলগুলো ZIP ফাইলে যুক্ত হবে
String[] filesToZip = {"file1.txt", "file2.txt"};
try {
// FileOutputStream দিয়ে ZIP ফাইল তৈরি করা
FileOutputStream fos = new FileOutputStream(zipFileName);
// ZipOutputStream ব্যবহার করে ZIP আর্কাইভ তৈরি
ZipOutputStream zos = new ZipOutputStream(fos);
// প্রতিটি ফাইলের জন্য ZipEntry তৈরি করা
for (String fileName : filesToZip) {
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
// ফাইলের ডেটা ZIP ফাইলে লেখার জন্য buffer ব্যবহার করা
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
// এন্ট্রি বন্ধ করা
zos.closeEntry();
fis.close();
}
// ZIP আউটপুট স্ট্রিম বন্ধ করা
zos.close();
System.out.println("ZIP file created successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
কোডের ব্যাখ্যা:
- ZipOutputStream:
ZipOutputStreamএকটি আউটপুট স্ট্রিম যা ZIP ফাইল তৈরি করার জন্য ব্যবহৃত হয়।- এটি
FileOutputStreamএর সাথে কাজ করে, যার মাধ্যমে আমরা ZIP ফাইলের উদ্দেশ্যস্থলে ডেটা লিখতে পারি।
- ZipEntry:
ZipEntryহলো ZIP ফাইলের মধ্যে একটি ফাইলের প্রতিনিধিত্ব। প্রতিটি ফাইলকে ZIP আর্কাইভে এন্ট্রি হিসেবে সংযুক্ত করতেputNextEntry()মেথড ব্যবহার করা হয়।
- FileInputStream:
- প্রতিটি ফাইলের জন্য
FileInputStreamব্যবহার করা হয়, যাতে আমরা ফাইলটির ডেটা ZIP ফাইলে লেখার জন্য পড়তে পারি।
- প্রতিটি ফাইলের জন্য
- Writing the Data:
- ফাইলের ডেটা পাঠানো হয়
buffer(যা 1024 বাইট ধারণ করে) ব্যবহার করে, এবংZipOutputStreamএর মাধ্যমে তা ZIP ফাইলে লেখানো হয়।
- ফাইলের ডেটা পাঠানো হয়
- Closing the Streams:
zos.closeEntry()এবংfis.close()ব্যবহৃত হয় যাতে প্রতিটি ফাইলের লেখার প্রক্রিয়া শেষ হয়ে যায় এবং স্ট্রিমগুলো বন্ধ হয়ে যায়।
বিভিন্ন ফাইল এবং ডিরেক্টরি ZIP ফাইলে যুক্ত করার উদাহরণ
যদি আপনি একাধিক ফাইল এবং ডিরেক্টরি একসাথে ZIP ফাইলে যোগ করতে চান, তাহলে এটি নিম্নরূপভাবে করা যেতে পারে।
import java.io.*;
import java.util.zip.*;
public class ZipDirectoryExample {
public static void main(String[] args) {
// আউটপুট ZIP ফাইলের নাম
String zipFileName = "directory.zip";
// যে ডিরেক্টরি ZIP ফাইলে যুক্ত করা হবে
String directoryToZip = "myFolder";
try {
// FileOutputStream দিয়ে ZIP ফাইল তৈরি করা
FileOutputStream fos = new FileOutputStream(zipFileName);
// ZipOutputStream ব্যবহার করে ZIP আর্কাইভ তৈরি
ZipOutputStream zos = new ZipOutputStream(fos);
// ডিরেক্টরির সব ফাইল এবং সাবডিরেক্টরি গুলি রিড করা
File dir = new File(directoryToZip);
zipDirectory(dir, dir.getName(), zos);
// ZIP আউটপুট স্ট্রিম বন্ধ করা
zos.close();
System.out.println("Directory ZIP file created successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws IOException {
File[] files = folder.listFiles();
for (File file : files) {
if (file.isDirectory()) {
// যদি এটি একটি ডিরেক্টরি হয়, তবে ZIP এ ডিরেক্টরি এন্ট্রি যুক্ত করুন
zipDirectory(file, parentFolder + "/" + file.getName(), zos);
} else {
// যদি এটি একটি ফাইল হয়, তাহলে ফাইলটি ZIP এ যোগ করুন
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(parentFolder + "/" + file.getName());
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
fis.close();
}
}
}
}
কোডের ব্যাখ্যা:
- ZipEntry with Directory Structure:
zipDirectory()মেথডের মাধ্যমে ডিরেক্টরির মধ্যে থাকা সব ফাইল এবং সাবডিরেক্টরিগুলিকে ZIP ফাইলে যুক্ত করা হয়।ZipEntryব্যবহার করে প্রতিটি ফাইল বা ডিরেক্টরি আর্কাইভে অ্যাড করা হয়।
- Recursive Directory Zipping:
- যদি কোনো ফোল্ডার থাকে, তবে
zipDirectory()মেথডটি রিকার্সিভলি কাজ করবে এবং সেই ফোল্ডার এবং তার মধ্যে থাকা সব ফাইল এবং সাবডিরেক্টরি গুলিকে ZIP আর্কাইভে যুক্ত করবে।
- যদি কোনো ফোল্ডার থাকে, তবে
- ZIP ফাইল তৈরি করা Java Zip API এর মাধ্যমে খুবই সহজ এবং কার্যকরী। আপনি
ZipOutputStreamএবংZipEntryব্যবহার করে একাধিক ফাইল এবং ডিরেক্টরি দ্রুত ZIP ফাইলে সংরক্ষণ করতে পারবেন। - Java Zip API ফাইল কমপ্রেশন এবং আর্কাইভ তৈরি করার জন্য একটি শক্তিশালী এবং নমনীয় টুলস, যা আপনি আপনার অ্যাপ্লিকেশনের ফাইল পরিচালনা ক্ষমতা বাড়ানোর জন্য ব্যবহার করতে পারেন।
ZipOutputStream একটি Java ক্লাস যা java.util.zip প্যাকেজের অন্তর্গত এবং এটি Zip ফাইল তৈরি করার জন্য ব্যবহৃত হয়। এটি আউটপুট স্ট্রিম হিসেবে কাজ করে এবং Zip ফাইলের মধ্যে একাধিক ফাইল বা ডিরেক্টরি সংরক্ষণ করতে ব্যবহৃত হয়। ZipOutputStream এর কিছু গুরুত্বপূর্ণ মেথড রয়েছে, যেগুলোর মাধ্যমে আপনি Zip ফাইলের মধ্যে ফাইল অ্যাড, ডেটা লেখার এবং এন্ট্রি বন্ধ করার কাজ করতে পারেন।
নিচে ZipOutputStream এর কিছু গুরুত্বপূর্ণ মেথড এবং তাদের ব্যবহার বর্ণনা করা হলো:
1. putNextEntry(ZipEntry e)
- বর্ণনা:
putNextEntry()মেথডটি একটি নতুন ZipEntry তৈরি করতে ব্যবহৃত হয় এবং এটি Zip ফাইলের মধ্যে একটি নতুন এন্ট্রি হিসেবে সেটি অন্তর্ভুক্ত করে। এটি একটি ফাইল বা ডিরেক্টরির প্রতিনিধিত্ব করে যা Zip আর্কাইভে সংরক্ষিত হবে। - ব্যবহার: আপনি যেই ফাইলটি Zip ফাইলে যোগ করতে চান, তার জন্য একটি
ZipEntryতৈরি করে, তারপর এই মেথডের মাধ্যমে সেই এন্ট্রিটিZipOutputStreamএ যোগ করবেন। সিনট্যাক্স:
public void putNextEntry(ZipEntry e) throws IOException- অর্থ:
e:ZipEntryঅবজেক্ট যা নতুন এন্ট্রি প্রতিনিধিত্ব করে (ফাইল বা ডিরেক্টরি)।
- কোনো ব্যতিক্রম:
- IOException: যদি কোনো I/O ত্রুটি ঘটে।
উদাহরণ:
File fileToZip = new File("file1.txt"); ZipEntry zipEntry = new ZipEntry(fileToZip.getName()); zipOut.putNextEntry(zipEntry);
2. write(byte[] b, int off, int len)
- বর্ণনা:
write()মেথডটি Zip এন্ট্রির জন্য ডেটা লেখার কাজ করে। এটি একটি নির্দিষ্ট বাইট অ্যারে থেকে ডেটা লেখে। সাধারণত, এটি একটি ফাইলের কনটেন্ট Zip ফাইলে লেখার জন্য ব্যবহৃত হয়। - ব্যবহার: যখন
putNextEntry()দ্বারা একটি নতুন এন্ট্রি তৈরি করা হয়, তখন এই মেথডটি ব্যবহার করে সেই এন্ট্রির মধ্যে ডেটা লেখা হয়। এই মেথডের মাধ্যমে আপনি নির্দিষ্ট বাইট অ্যারে পাঠাতে পারেন যা Zip ফাইলে স্টোর হবে। সিনট্যাক্স:
public void write(byte[] b, int off, int len) throws IOException- অর্থ:
b: বাইট অ্যারে যা Zip ফাইলে লেখা হবে।off: বাইট অ্যারের সূচনামূলক অবস্থান।len: কতগুলি বাইট লেখা হবে (অথবা মোট বাইট সংখ্যা)।
- কোনো ব্যতিক্রম:
- IOException: যদি কোনো I/O ত্রুটি ঘটে।
উদাহরণ:
byte[] bytes = new byte[1024]; int length; FileInputStream fis = new FileInputStream(fileToZip); while ((length = fis.read(bytes)) >= 0) { zipOut.write(bytes, 0, length); }
3. closeEntry()
- বর্ণনা:
closeEntry()মেথডটি বর্তমান ZipEntry বন্ধ করার জন্য ব্যবহৃত হয়। একবারputNextEntry()এবংwrite()ব্যবহৃত হলে,closeEntry()কল করা হয় যাতে ওই এন্ট্রির জন্য সমস্ত লেখার কাজ শেষ হয় এবং নতুন এন্ট্রি যোগ করার জন্য প্রস্তুতি নেয়া যায়। - ব্যবহার: যখন আপনি একটি ZipEntry সম্পূর্ণভাবে লেখার কাজ শেষ করেন, তখন
closeEntry()কল করতে হয়। এটি নিশ্চিত করে যে ঐ ফাইলটি Zip আর্কাইভে সঠিকভাবে সংরক্ষিত হয়েছে। সিনট্যাক্স:
public void closeEntry() throws IOException- কোনো ব্যতিক্রম:
- IOException: যদি কোনো I/O ত্রুটি ঘটে।
উদাহরণ:
zipOut.closeEntry();
সম্পূর্ণ উদাহরণ (Zip ফাইল তৈরি করা)
import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) {
byte[] buffer = new byte[1024];
try {
// Zip ফাইল তৈরি করা
FileOutputStream fos = new FileOutputStream("example.zip");
ZipOutputStream zipOut = new ZipOutputStream(fos);
// ফাইলের নামের উপর ভিত্তি করে ZipEntry তৈরি করা
File fileToZip = new File("file1.txt");
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
// ZipEntry যোগ করা
zipOut.putNextEntry(zipEntry);
// ফাইলের ডেটা Zip ফাইলে লেখা
int length;
while ((length = fis.read(buffer)) >= 0) {
zipOut.write(buffer, 0, length);
}
// Entry বন্ধ করা
zipOut.closeEntry();
fis.close();
// ZipOutputStream বন্ধ করা
zipOut.close();
System.out.println("Zip ফাইল সফলভাবে তৈরি হয়েছে!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- প্রথমে,
FileOutputStreamএবংZipOutputStreamব্যবহার করে Zip ফাইল তৈরি করা হয়েছে। putNextEntry()মেথড দ্বারাZipEntryতৈরি করা হয়েছে যাfile1.txtফাইলের প্রতিনিধিত্ব করে।- তারপর,
write()মেথড ব্যবহার করেfile1.txtফাইলের কনটেন্ট Zip ফাইলে লেখা হয়েছে। closeEntry()মেথড দ্বারা ZipEntry বন্ধ করা হয়েছে যাতে পরবর্তী এন্ট্রি যোগ করা যেতে পারে।- অবশেষে,
ZipOutputStreamবন্ধ করা হয়েছে। putNextEntry(): নতুন ZipEntry তৈরি করার জন্য ব্যবহৃত হয়।write(): ZipEntry তে ডেটা লেখার জন্য ব্যবহৃত হয়।closeEntry(): বর্তমান ZipEntry বন্ধ করে নতুন এন্ট্রি তৈরির জন্য প্রস্তুত করে।
এই মেথডগুলো ZipOutputStream ক্লাসে প্রধানত Zip ফাইল তৈরি এবং ডেটা লেখার জন্য ব্যবহৃত হয় এবং Java তে Zip ফাইলের সঙ্গে কাজ করার সময় অত্যন্ত গুরুত্বপূর্ণ।
Multiple ফাইল এবং ডিরেক্টরি Compress করার উদাহরণ: Java তে java.util.zip প্যাকেজ ব্যবহার করে একাধিক ফাইল এবং ডিরেক্টরি জিপ (compress) করা যেতে পারে। এই উদাহরণে, আমরা দেখব কিভাবে Java দিয়ে একটি ডিরেক্টরি এবং তার ভিতরের সমস্ত ফাইলগুলি জিপ ফাইলে কম্প্রেস করা যায়।
উদাহরণ: Multiple ফাইল এবং ডিরেক্টরি কম্প্রেস করা
এখানে একটি ডিরেক্টরি এবং তার সব সাব-ডিরেক্টরি ও ফাইলগুলিকে একটি ZIP ফাইলে কম্প্রেস করার উদাহরণ দেওয়া হলো:
কোড:
import java.io.*;
import java.util.zip.*;
public class ZipDirectoryExample {
public static void main(String[] args) {
// কম্প্রেস করার জন্য ডিরেক্টরি এবং ZIP ফাইলের পাথ
String directoryPath = "src_directory"; // আপনার ডিরেক্টরি পাথ দিন
String zipFilePath = "compressed.zip"; // কম্প্রেস করা ZIP ফাইলের পাথ
try {
// ZIP ফাইল তৈরি করতে FileOutputStream এবং ZipOutputStream ব্যবহার করা
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zos = new ZipOutputStream(fos);
// ডিরেক্টরি কম্প্রেস করার জন্য recursive ফাংশন কল করুন
File directoryToZip = new File(directoryPath);
zipDirectory(directoryToZip, directoryToZip.getName(), zos);
// ZipOutputStream বন্ধ করুন
zos.close();
System.out.println("ফাইল এবং ডিরেক্টরি সফলভাবে ZIP ফাইলে কম্প্রেস করা হয়েছে।");
} catch (IOException e) {
e.printStackTrace();
}
}
// Recursive method to zip a directory
private static void zipDirectory(File folderToZip, String parentFolderName, ZipOutputStream zos) throws IOException {
// যদি ফোল্ডারটি একটি ডিরেক্টরি হয়
if (folderToZip.isDirectory()) {
File[] files = folderToZip.listFiles();
// প্রতিটি ফাইল বা সাব-ডিরেক্টরি লুপ করুন
for (File file : files) {
zipDirectory(file, parentFolderName + File.separator + file.getName(), zos);
}
} else {
// ফাইলটির জন্য একটি নতুন ZipEntry তৈরি করুন
FileInputStream fis = new FileInputStream(folderToZip);
ZipEntry zipEntry = new ZipEntry(parentFolderName);
zos.putNextEntry(zipEntry);
// ফাইলের ডেটা জিপ ফাইলে লিখুন
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
// ZipEntry বন্ধ করুন
zos.closeEntry();
fis.close();
}
}
}
কোডের ব্যাখ্যা:
FileOutputStreamএবংZipOutputStream:ZipOutputStreamব্যবহার করে একটি নতুন ZIP ফাইল তৈরি করা হচ্ছে। এই স্ট্রীমের মাধ্যমে ফাইলগুলি কম্প্রেস করে ZIP ফাইলে সংরক্ষণ করা হয়।
zipDirectory()রিকর্সিভ ফাংশন:- এই ফাংশনটি ডিরেক্টরি এবং তার ভিতরের সমস্ত ফাইল এবং সাব-ডিরেক্টরি রিকর্সিভভাবে কম্প্রেস করে। প্রথমে ডিরেক্টরির মধ্যে যদি অন্য কোনো সাব-ডিরেক্টরি থাকে, তাহলে সেই সাব-ডিরেক্টরি গুলিকে জিপ ফাইলে অ্যাড করা হয়।
- ফোল্ডার এবং ফাইল কম্প্রেশন:
ZipEntryতৈরি করে, এবংZipOutputStream.putNextEntry()ব্যবহার করে প্রতিটি ফাইল বা ডিরেক্টরি এন্ট্রি হিসেবে ZIP ফাইলে অ্যাড করা হয়।FileInputStreamব্যবহার করে ফাইলের কনটেন্ট ZIP ফাইলে লেখার জন্য ডেটা পড়া হয়।
- Recursive Process:
zipDirectory()ফাংশনটি রিকার্সিভভাবে সমস্ত সাব-ডিরেক্টরি এবং ফাইল প্রক্রিয়া করে। এর মাধ্যমে যে কোনো গভীরতা পর্যন্ত ডিরেক্টরি স্ট্রাকচার হ্যান্ডেল করা যায়।
- ফাইলের কনটেন্ট জিপ ফাইলে লেখার জন্য
byte[] bufferব্যবহার করা হয়। প্রতিটি ফাইল পড়ার পর, তা ZIP ফাইলে লেখা হয়।
কিছু গুরুত্বপূর্ণ পয়েন্ট:
- ডিরেক্টরি স্ট্রাকচার সংরক্ষণ: এই কোডটি নিশ্চিত করে যে, ZIP ফাইলে ডিরেক্টরি এবং তার ভিতরের সাব-ডিরেক্টরি গুলি সঠিকভাবে সংরক্ষিত হয়।
- Recursive Approach: একটি রিকার্সিভ পদ্ধতি ব্যবহার করা হয়েছে যাতে ফোল্ডার স্ট্রাকচার এবং তার ভিতরের সকল ফাইল সঠিকভাবে জিপ করা যায়।
- কম্প্রেশন: ZIP ফাইল তৈরির সময় ফাইলগুলি কম্প্রেস করা হয়, যা ডেটা সঞ্চয় এবং ট্রান্সফারের ক্ষেত্রে কার্যকর।
উদাহরণ ফোল্ডার স্ট্রাকচার:
ধরা যাক আপনার src_directory এর মধ্যে ফোল্ডার এবং ফাইলগুলো এমনভাবে রয়েছে:
src_directory/
├── file1.txt
├── file2.txt
└── subfolder/
└── file3.txt
অফার করা ZIP আউটপুট:
compressed.zip/
├── file1.txt
├── file2.txt
└── subfolder/
└── file3.txt
সারাংশ:
Java তে java.util.zip প্যাকেজ ব্যবহার করে একাধিক ফাইল এবং ডিরেক্টরি কম্প্রেস করা সম্ভব। এই উদাহরণে আমরা একটি ডিরেক্টরি এবং তার সব ফাইল ও সাব-ডিরেক্টরি জিপ ফাইলে কম্প্রেস করেছি। রিকার্সিভ পদ্ধতি ব্যবহার করে আপনি কোন ডিরেক্টরি স্ট্রাকচার এবং ফাইলকেও কম্প্রেস করতে পারবেন।
Read more