File Compression এবং Decompression হল ডেটা ম্যানিপুলেশন প্রক্রিয়া, যা ডেটা সঞ্চয় এবং ট্রান্সফার আরও কার্যকরী ও দ্রুত করে। Java তে ফাইল কম্প্রেস এবং ডি-কম্প্রেস করার জন্য ZipInputStream এবং ZipOutputStream ক্লাস ব্যবহৃত হয়, যা zip ফাইল ফরম্যাটে ডেটা প্যাক এবং আনপ্যাক করতে সহায়ক।
ZipInputStream এবং ZipOutputStream এর ভূমিকা:
- ZipOutputStream: এটি ব্যবহার করে আপনি একটি নতুন ZIP ফাইল তৈরি করতে পারেন এবং তাতে এক বা একাধিক ফাইল কম্প্রেস করতে পারেন। এটি
OutputStreamএর একটি সাবক্লাস। - ZipInputStream: এটি ব্যবহার করে আপনি ZIP ফাইল থেকে কম্প্রেস করা ডেটা ডি-কম্প্রেস করতে পারেন এবং সেই ডেটাকে পড়তে পারেন। এটি
InputStreamএর একটি সাবক্লাস।
ZipOutputStream এবং ZipInputStream এর মূল বৈশিষ্ট্য:
- ZipOutputStream:
- এটি OutputStream এর উপর ভিত্তি করে কাজ করে এবং ZIP ফাইলের মধ্যে একাধিক ফাইল বা ডেটা লিখতে সহায়ক।
putNextEntry()মেথড দ্বারা নতুন ফাইল যোগ করা হয় এবংcloseEntry()মেথড দ্বারা ফাইলটি বন্ধ করা হয়।
- ZipInputStream:
- এটি InputStream এর উপর ভিত্তি করে কাজ করে এবং ZIP ফাইলের মধ্যে সংরক্ষিত ফাইলগুলি পড়তে সহায়ক।
getNextEntry()মেথড দ্বারা পরবর্তী ফাইলের উপাদান পড়া হয় এবংcloseEntry()দ্বারা সেই ফাইলটি বন্ধ করা হয়।
ZipOutputStream উদাহরণ: File Compression (Zip Output)
এই উদাহরণে, আমরা ZipOutputStream ব্যবহার করে একটি ফোল্ডারের সমস্ত ফাইলকে ZIP ফাইল এ কম্প্রেস করব।
ফাইল কম্প্রেস করার উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class ZipFileCompressionExample {
public static void main(String[] args) {
String sourceDir = "exampleFolder"; // ফোল্ডারের পাথ যেখানে ফাইলগুলো আছে
String zipFile = "compressed.zip"; // কম্প্রেস করা ফাইলের নাম
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) {
File dir = new File(sourceDir);
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
compressFile(file, zos); // ফাইল কম্প্রেস করা
}
}
}
}
System.out.println("Files compressed successfully into " + zipFile);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void compressFile(File file, ZipOutputStream zos) throws IOException {
try (FileInputStream fis = new FileInputStream(file)) {
ZipEntry entry = new ZipEntry(file.getName());
zos.putNextEntry(entry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
}
}
}
ব্যাখ্যা:
- ZipOutputStream ব্যবহার করে ফাইলগুলি একটি zip ফাইলে কম্প্রেস করা হচ্ছে।
- ফোল্ডারের মধ্যে সব ফাইল পড়া হচ্ছে এবং প্রতিটি ফাইল ZipEntry হিসেবে কম্প্রেস করা হচ্ছে।
putNextEntry()মেথড দ্বারা নতুন ফাইল যোগ করা হচ্ছে এবংcloseEntry()দ্বারা ফাইলটি বন্ধ করা হচ্ছে।
আউটপুট:
Files compressed successfully into compressed.zip
ZipInputStream উদাহরণ: File Decompression (Zip Input)
এখন, ZipInputStream ব্যবহার করে zip ফাইল থেকে ডেটা ডি-কম্প্রেস করব।
ফাইল ডি-কম্প্রেস করার উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class ZipFileDecompressionExample {
public static void main(String[] args) {
String zipFile = "compressed.zip"; // কম্প্রেস করা ফাইল
String outputDir = "outputFolder"; // ডি-কম্প্রেস করা ফাইল রাখার ফোল্ডার
// ডি-কম্প্রেস করার জন্য ফোল্ডার তৈরি
new File(outputDir).mkdirs();
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
File newFile = new File(outputDir, entry.getName());
try (FileOutputStream fos = new FileOutputStream(newFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
}
zis.closeEntry();
System.out.println("Decompressed: " + entry.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- ZipInputStream ব্যবহার করে compressed.zip ফাইলটি খুলে তার মধ্যে থাকা ফাইলগুলি outputFolder ফোল্ডারে ডি-কম্প্রেস করা হচ্ছে।
getNextEntry()মেথড দ্বারা পরবর্তী ফাইলের উপাদান পড়া হচ্ছে এবংcloseEntry()দ্বারা সেই ফাইলটি বন্ধ করা হচ্ছে।
আউটপুট:
Decompressed: file1.txt
Decompressed: file2.txt
ZipInputStream এবং ZipOutputStream এর সুবিধা
- File Compression:
- ZipOutputStream ব্যবহার করে আপনি একাধিক ফাইলকে একত্রে কম্প্রেস করতে পারেন, যা স্থান সঞ্চয়ে সহায়ক।
- File Decompression:
- ZipInputStream ব্যবহার করে আপনি একটি zip ফাইল থেকে ডেটা এক্সট্র্যাক্ট করতে পারেন এবং সেটি ব্যবহার করতে পারেন।
- Multiple Files:
- একাধিক ফাইলকে একটি ZIP ফাইলে সংরক্ষণ বা একাধিক ফাইল থেকে একসাথে ডেটা বের করা সম্ভব।
- Stream-Based I/O:
- ZipInputStream এবং ZipOutputStream স্ট্রীম-ভিত্তিক, তাই বড় ফাইল হ্যান্ডেল করতে কার্যকরী।
- ZipInputStream এবং ZipOutputStream Java তে ফাইল কম্প্রেশন এবং ডি-কম্প্রেশন করার জন্য শক্তিশালী টুলস।
- ZipOutputStream দিয়ে একাধিক ফাইল একটি ZIP ফাইলে কম্প্রেস করা যায়, এবং ZipInputStream দিয়ে সেই ফাইল থেকে ডেটা ডি-কম্প্রেস করা যায়।
- Java Tuples ব্যবহার করে আপনি ফাইলের তথ্য যেমন নাম, আকার, এবং অন্যান্য প্রপার্টি সংরক্ষণ এবং পরিচালনা করতে পারেন।
File Compression হলো একটি প্রক্রিয়া যার মাধ্যমে ফাইলের আকার ছোট করা হয়, যাতে সেই ফাইলটি কম স্পেস নেয় এবং আরও দ্রুত ট্রান্সফার বা সংরক্ষণ করা যায়। এটি ডেটার পুনরুদ্ধারের জন্য বিশেষ অ্যালগরিদম ব্যবহার করে, যা ফাইলের আকার সংকুচিত করতে সহায়ক। File Compression সাধারনত দুটি কারণে ব্যবহৃত হয়: স্টোরেজ সঞ্চয় এবং ডেটা ট্রান্সফার গতি বৃদ্ধি।
Java-তে File Compression একটি গুরুত্বপূর্ণ কৌশল, যা অনেক সময় ডেটা আর্কাইভিং, নেটওয়ার্কিং, এবং বৃহৎ ডেটা সেটের সাথে কাজ করার সময় ব্যবহৃত হয়।
File Compression এর ধারণা
File Compression ফাইলের ডেটাকে এমনভাবে সংকুচিত করে যাতে কম মেমরি স্পেস প্রয়োজন হয়। এই প্রক্রিয়ায় ডেটার গুরুত্বপূর্ণ অংশগুলো সংরক্ষিত থাকে, তবে মেমরি ব্যবস্থাপনা আরও দক্ষ হয়।
Compression দুটি প্রকারে হতে পারে:
- Lossless Compression (নষ্ট না হওয়া):
- এই ধরনের কমপ্রেশন পদ্ধতিতে ডেটা সম্পূর্ণভাবে পুনরুদ্ধারযোগ্য থাকে। অর্থাৎ, কমপ্রেসড ফাইল থেকে কমপ্রেস করা ডেটা পুনরুদ্ধার করলে মূল ডেটা হারায় না।
- উদাহরণ: ZIP, GZIP, PNG, LZ77, Huffman Coding ইত্যাদি।
- Lossy Compression (নষ্ট হওয়া):
- এই ধরনের কমপ্রেশন পদ্ধতিতে কিছু ডেটা হারিয়ে যায়। এটি সাধারণত মিডিয়া ফাইল যেমন ইমেজ, অডিও, এবং ভিডিও ফাইল কমপ্রেস করার সময় ব্যবহৃত হয়, যেখানে ডেটার কিছু অংশ কম গুরুত্বপূর্ণ হতে পারে।
- উদাহরণ: JPEG, MP3, MPEG ইত্যাদি।
File Compression এর প্রয়োজনীয়তা
- স্টোরেজ সঞ্চয় (Storage Savings):
- কমপ্রেসড ফাইলগুলি কম মেমরি বা ডিস্ক স্পেস গ্রহণ করে, যা স্টোরেজের খরচ কমায়। বৃহৎ ডেটাবেস বা ফাইল সিস্টেমে কমপ্রেসড ফাইল ব্যবহার করা হলে স্টোরেজ ব্যবস্থাপনা অনেক সহজ হয়ে যায়।
- ডেটা ট্রান্সফারের গতি বৃদ্ধি (Faster Data Transfer):
- কমপ্রেসড ফাইল ছোট হওয়ায়, নেটওয়ার্কের মাধ্যমে ফাইল স্থানান্তর দ্রুত হয়। এটি ইন্টারনেট বা লোকাল নেটওয়ার্কে ফাইল ট্রান্সফারের সময় কমানোর জন্য ব্যবহৃত হয়।
- ডেটা সিকিউরিটি (Data Security):
- কিছু কমপ্রেসড ফাইল ফরম্যাট যেমন ZIP ফাইল পাসওয়ার্ড দিয়ে সুরক্ষিত করা যেতে পারে, যা ফাইলের নিরাপত্তা বাড়ায়। এমনকি Lossless Compression ডেটা হারানো ছাড়াই তার গোপনীয়তা রক্ষা করতে সহায়ক।
- বৃহৎ ডেটা সেটের প্রক্রিয়াকরণ (Handling Large Data Sets):
- বড় ডেটা সেটের সঙ্গে কাজ করার সময় ফাইল কমপ্রেস করা কার্যকরী হয় কারণ কমপ্রেসড ফাইলগুলি আরও দ্রুত প্রক্রিয়া করা এবং স্থানান্তর করা যায়।
- অ্যাক্সেসের সুবিধা (Faster Access to Archived Files):
- কমপ্রেসড ফাইলগুলির অ্যাক্সেস করার সময় এগুলি দ্রুত খুলে পড়া যায় (যেমন ZIP ফাইল)। এটি ফাইল সিস্টেমের সাথে কাজ করার সময় ফাইল আর্কাইভিং এর জন্য একটি গুরুত্বপূর্ণ কৌশল।
Java তে File Compression: Java API
Java তে ফাইল কমপ্রেস করার জন্য java.util.zip প্যাকেজের বিভিন্ন ক্লাস ব্যবহার করা হয়। দুটি প্রধান ক্লাস যা কমপ্রেসড ফাইল তৈরি এবং আনপ্যাক করতে ব্যবহৃত হয় তা হল:
ZipOutputStream: ফাইল বা ডিরেক্টরিকে ZIP ফরম্যাটে কমপ্রেস করার জন্য ব্যবহৃত হয়।ZipInputStream: ZIP ফাইল থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
File Compression Example (ZIP Compression)
১. ফাইল কমপ্রেস করা (ZIP Compression):
import java.io.*;
import java.util.zip.*;
public class FileCompressionExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("compressed.zip");
ZipOutputStream zipOut = new ZipOutputStream(fos)) {
// Create a new Zip entry for the file
ZipEntry zipEntry = new ZipEntry("input.txt");
zipOut.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zipOut.write(buffer, 0, length);
}
System.out.println("File has been compressed successfully!");
} catch (IOException e) {
System.out.println("Error occurred during compression: " + e.getMessage());
}
}
}
ব্যাখ্যা:
ZipOutputStreamব্যবহার করে input.txt ফাইলটি compressed.zip নামে কমপ্রেস করা হয়েছে।ZipEntryব্যবহার করে কমপ্রেসড ফাইলে ফাইলটির এন্ট্রি যোগ করা হয়েছে।- এই কোডটি
input.txtফাইলটি ZIP ফরম্যাটে কমপ্রেস করবে।
২. ZIP ফাইল থেকে ডেটা আনজিপ করা (ZIP Decompression):
import java.io.*;
import java.util.zip.*;
public class FileDecompressionExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("compressed.zip");
ZipInputStream zipIn = new ZipInputStream(fis)) {
ZipEntry entry = zipIn.getNextEntry();
while (entry != null) {
String fileName = entry.getName();
try (FileOutputStream fos = new FileOutputStream(fileName)) {
byte[] buffer = new byte[1024];
int length;
while ((length = zipIn.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
System.out.println("File has been decompressed successfully!");
} catch (IOException e) {
System.out.println("Error occurred during decompression: " + e.getMessage());
}
}
}
ব্যাখ্যা:
ZipInputStreamব্যবহার করে compressed.zip ফাইলের ভিতরে থাকা input.txt ফাইলটি পুনরুদ্ধার করা হয়েছে এবং ডিরেক্টরিতে আউটপুট ফাইল হিসেবে লিখা হয়েছে।
File Compression ফাইলের আকার ছোট করার একটি গুরুত্বপূর্ণ প্রক্রিয়া যা স্টোরেজ সঞ্চয় এবং ডেটা ট্রান্সফার গতি বাড়াতে সহায়ক। Java তে java.util.zip প্যাকেজের সাহায্যে সহজেই ফাইল কমপ্রেস এবং আনকমপ্রেস করা যায়।
- Lossless Compression প্রক্রিয়া ডেটার কোন ক্ষতি না করে ফাইল কমপ্রেস করে, যা স্টোরেজ ব্যবস্থাপনা এবং ফাইল ট্রান্সফার করতে সহায়ক।
- Java Tuples ব্যবহার করে ফাইলের নাম, আকার এবং অন্যান্য প্রোপার্টি সংরক্ষণ করা যেতে পারে, যা পরবর্তী ব্যবহারের জন্য সহায়ক হতে পারে।
এইভাবে, Java File Compression কার্যকরভাবে ফাইল পরিচালনা এবং স্থান সঞ্চয় করার জন্য একটি কার্যকরী কৌশল হতে পারে।
Java তে ZipInputStream এবং ZipOutputStream ক্লাসগুলি ব্যবহার করে ফাইল কমপ্রেস করা বা ডিকমপ্রেস করা যেতে পারে। ZipInputStream এবং ZipOutputStream ক্লাসগুলি java.util.zip প্যাকেজে অন্তর্ভুক্ত এবং তারা ZIP ফাইল ফরম্যাট ব্যবহার করে ডেটা কমপ্রেস এবং এক্সট্র্যাক্ট করার জন্য ব্যবহৃত হয়।
ZipOutputStream: একটি ফাইলকে ZIP ফরম্যাট-এ কমপ্রেস করতে ব্যবহৃত হয়।ZipInputStream: একটি ZIP ফাইল থেকে ডেটা পড়ে (ডিকমপ্রেস)।
এই ক্লাসগুলি ফাইল বা ডিরেক্টরি কমপ্রেস এবং এক্সট্র্যাক্ট করতে সাহায্য করে।
ZipOutputStream - ফাইল কমপ্রেস করা
ZipOutputStream ব্যবহার করে আপনি একটি বা একাধিক ফাইলকে ZIP ফাইল-এ কমপ্রেস করতে পারেন। এই ক্লাসটি OutputStream এর একটি সাবক্লাস, যা ডেটা ZIP ফরম্যাটে লেখার জন্য ব্যবহৃত হয়।
ZipOutputStream উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class ZipFileExample {
public static void main(String[] args) {
String sourceFile = "example.txt";
String zipFileName = "example.zip";
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos)) {
// Add a new entry (file) to the ZIP
ZipEntry zipEntry = new ZipEntry("example.txt"); // The name of the file inside the ZIP
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length); // Write data to ZIP file
}
zos.closeEntry(); // Close the current ZIP entry
System.out.println("File successfully compressed to " + zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipOutputStreamব্যবহার করে ফাইলের ডেটা ZIP ফরম্যাটে কমপ্রেস করা হয়েছে।ZipEntryক্লাসটি ব্যবহার করা হয়েছে, যা ZIP ফাইলের ভিতরে প্রতিটি ফাইলের জন্য একটি এন্ট্রি তৈরি করে।putNextEntry()মেথড দ্বারা একটি নতুন ফাইল এন্ট্রি তৈরি করা হয় এবংcloseEntry()মেথড দ্বারা শেষ করা হয়।fis.read(buffer)ব্যবহার করে ফাইলের ডেটা পড়ে এবংzos.write()দ্বারা ZIP ফাইলের মধ্যে লেখা হয়।
ZipInputStream - ZIP ফাইল ডিকমপ্রেস করা
ZipInputStream ব্যবহার করে আপনি একটি ZIP ফাইল থেকে ডেটা ডিকমপ্রেস করতে পারেন। এই ক্লাসটি InputStream এর একটি সাবক্লাস, যা ZIP ফাইল থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
ZipInputStream উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class UnzipFileExample {
public static void main(String[] args) {
String zipFileName = "example.zip";
String outputDir = "output/";
try (FileInputStream fis = new FileInputStream(zipFileName);
ZipInputStream zis = new ZipInputStream(fis)) {
// Create output directory if it does not exist
File dir = new File(outputDir);
if (!dir.exists()) {
dir.mkdirs();
}
ZipEntry zipEntry;
while ((zipEntry = zis.getNextEntry()) != null) {
// Create output file for each entry in the ZIP
File newFile = new File(outputDir + zipEntry.getName());
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile))) {
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) > 0) {
bos.write(buffer, 0, length); // Write the decompressed data to the output file
}
}
zis.closeEntry(); // Close the current ZIP entry
}
System.out.println("Files successfully extracted to " + outputDir);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipInputStreamব্যবহার করে ZIP ফাইলের সমস্ত এন্ট্রি ডিকমপ্রেস করা হয়েছে।getNextEntry()মেথডের মাধ্যমে ZIP ফাইলের প্রতিটি এন্ট্রি পড়া হয়।BufferedOutputStreamব্যবহার করে ডিকমপ্রেসড ডেটা নির্দিষ্ট ফাইলে লেখা হয়।zis.closeEntry()দিয়ে প্রতিটি এন্ট্রি সম্পন্ন করার পর সেটি বন্ধ করা হয়।
ZipInputStream এবং ZipOutputStream এর মধ্যে পার্থক্য
| বিষয় | ZipOutputStream | ZipInputStream |
|---|---|---|
| কাজ | ফাইল বা ডেটাকে ZIP ফরম্যাটে কমপ্রেস করে। | ZIP ফাইল থেকে ডেটা ডিকমপ্রেস করে। |
| স্ট্রিম টাইপ | OutputStream (write data) | InputStream (read data) |
| ব্যবহার | ফাইল কমপ্রেস করার জন্য। | ফাইল ডিকমপ্রেস করার জন্য। |
| এন্ট্রি ব্যবস্থাপনা | ZipEntry দ্বারা কমপ্রেসড ফাইল এন্ট্রি তৈরি করা হয়। | ZipEntry দ্বারা ZIP ফাইল থেকে ডেটা পড়া হয়। |
Multiple Files Compression with ZipOutputStream
ZipOutputStream ব্যবহার করে আপনি একাধিক ফাইল একসাথে ZIP ফাইলে কমপ্রেস করতে পারেন। এটি একাধিক ZipEntry তৈরি করে এবং প্রত্যেকটি ফাইলের জন্য ডেটা লিখতে দেয়।
Multiple Files Compression উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class MultiFileZipExample {
public static void main(String[] args) {
String[] files = {"file1.txt", "file2.txt", "file3.txt"};
String zipFileName = "files.zip";
try (FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String fileName : files) {
File file = new File(fileName);
try (FileInputStream fis = new FileInputStream(file)) {
// Create a new ZIP entry for each file
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
// Read the file and write its content to the ZIP
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry(); // Close the entry
}
}
System.out.println("Multiple files compressed into " + zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- একাধিক ফাইলকে ZIP ফাইল-এ কমপ্রেস করা হচ্ছে। প্রতিটি ফাইলের জন্য আলাদা
ZipEntryতৈরি করা হয়েছে। - প্রতিটি ফাইল থেকে ডেটা পড়ে এবং
ZipOutputStreamএর মাধ্যমে ZIP ফাইলে লেখা হচ্ছে।
ZipInputStreamএবংZipOutputStreamফাইল কমপ্রেস এবং ডিকমপ্রেস করার জন্য Java-তে কার্যকরী টুল।ZipOutputStreamব্যবহার করে ফাইলকে ZIP ফরম্যাটে কমপ্রেস করা যায়, এবংZipInputStreamব্যবহার করে সেই কমপ্রেসড ফাইল থেকে ডেটা পড়া যায়।- একাধিক ফাইলকে একটি ZIP ফাইল-এ কমপ্রেস করতে
ZipOutputStreamএর সাথে multipleZipEntryব্যবহার করা হয়।
এই কৌশলগুলি Java I/O এর মাধ্যমে ডেটা সংরক্ষণ এবং ট্রান্সফার করার জন্য খুবই কার্যকরী, বিশেষ করে যখন ফাইলের আকার বড় বা একাধিক ফাইল কমপ্রেস করতে হয়।
ফাইল extract এবং archive পরিচালনা করা একটি গুরুত্বপূর্ণ কাজ যা সাধারণত ফাইল সিস্টেম পরিচালনা এবং ডেটা ব্যাকআপ/রিস্টোর ব্যবস্থাপনায় ব্যবহৃত হয়। এই কাজগুলি সাধারণত zip, tar, gzip ফাইল ফরম্যাটের সাথে সম্পর্কিত। Java তে এই ধরনের ফাইলগুলি extract (আর্কাইভ থেকে বের করা) এবং archive (আর্কাইভ করা) করার জন্য Java API এর মাধ্যমে কার্যকরভাবে পরিচালনা করা যায়।
Java তে zip file handling এবং archiving করার জন্য দুটি প্রধান লাইব্রেরি ব্যবহৃত হয়:
- java.util.zip (Zip ফাইল এবং অন্যান্য কমপ্রেসড ফাইল পরিচালনার জন্য)
- Apache Commons Compress (আরও উন্নত আর্কাইভিং ফিচারের জন্য)
এখানে java.util.zip লাইব্রেরি এবং Apache Commons Compress ব্যবহার করে ফাইল Extract এবং Archive করার দুটি উদাহরণ দেওয়া হলো।
Java java.util.zip প্যাকেজ ব্যবহার করে Zip ফাইল তৈরি এবং Extract করা
java.util.zip প্যাকেজে ZipOutputStream এবং ZipInputStream ক্লাসগুলি ব্যবহার করে আপনি ফাইল আর্কাইভ করতে এবং আর্কাইভ ফাইল থেকে ডেটা বের করতে পারেন।
১. Zip ফাইল তৈরি করা (Archive)
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileExample {
public static void main(String[] args) {
try {
// আর্কাইভ ফাইল তৈরি
FileOutputStream fos = new FileOutputStream("archive.zip");
ZipOutputStream zos = new ZipOutputStream(fos);
// ফাইল যোগ করা
File file = new File("file1.txt");
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
// ফাইলের কন্টেন্ট zip ফাইলে লেখা
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
// ফাইল সিস্টেম স্ট্রিম বন্ধ
zos.closeEntry();
fis.close();
zos.close();
System.out.println("File archived successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipOutputStreamফাইল আর্কাইভ করতে ব্যবহৃত হয়।ZipEntryফাইলের প্রতিটি এন্ট্রি বা ফাইলকে প্রতিনিধিত্ব করে।- একাধিক ফাইল যোগ করতে, একই পদ্ধতি অনুসরণ করতে হবে এবং প্রতিটি ফাইলের জন্য একটি নতুন
ZipEntryতৈরি করতে হবে।
২. Zip ফাইল Extract করা (Unzip)
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class UnzipFileExample {
public static void main(String[] args) {
try {
// Zip ফাইল পড়ার জন্য ইনপুট স্ট্রিম
FileInputStream fis = new FileInputStream("archive.zip");
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry entry;
// Zip এন্ট্রির জন্য লুপ
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting file: " + entry.getName());
// ফাইল লিখতে আউটপুট স্ট্রিম তৈরি
FileOutputStream fos = new FileOutputStream(entry.getName());
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) >= 0) {
fos.write(buffer, 0, length);
}
fos.close();
zis.closeEntry();
}
// স্ট্রিম বন্ধ করা
zis.close();
fis.close();
System.out.println("Files extracted successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipInputStreamzip ফাইল পড়ার জন্য ব্যবহৃত হয়।ZipEntryব্যবহার করে zip ফাইলের প্রতিটি এন্ট্রি বের করা হয় এবংFileOutputStreamব্যবহার করে তা সিস্টেমে একটি ফাইলে লেখা হয়।
Apache Commons Compress ব্যবহার করে ফাইল Extract এবং Archive
Java-তে আরও উন্নত আর্কাইভিং ফিচার প্রয়োগ করতে Apache Commons Compress লাইব্রেরি ব্যবহার করা যেতে পারে, যা tar, gz, bz2, zip ইত্যাদি ফাইল ফরম্যাট সাপোর্ট করে।
১. Zip ফাইল তৈরি করা (Archive) using Apache Commons Compress
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import java.io.*;
public class ApacheCompressZipExample {
public static void main(String[] args) {
try (ZipArchiveOutputStream zos = new ZipArchiveOutputStream(new FileOutputStream("archive_advanced.zip"))) {
File file = new File("file1.txt");
try (FileInputStream fis = new FileInputStream(file)) {
ZipArchiveEntry zipEntry = new ZipArchiveEntry(file.getName());
zos.putArchiveEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
zos.closeArchiveEntry();
}
System.out.println("File archived using Apache Commons Compress successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipArchiveOutputStreamএবংZipArchiveEntryব্যবহার করে zip ফাইল আর্কাইভ করা হয়।- Apache Commons Compress লাইব্রেরি ব্যবহারে আর্কাইভ ফাইল তৈরির প্রক্রিয়া আরও সোজা এবং নমনীয় হয়ে যায়।
২. Zip ফাইল Extract করা (Unzip) using Apache Commons Compress
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import java.io.*;
public class ApacheCompressUnzipExample {
public static void main(String[] args) {
try (ZipArchiveInputStream zis = new ZipArchiveInputStream(new FileInputStream("archive_advanced.zip"))) {
ZipArchiveEntry entry;
while ((entry = zis.getNextZipEntry()) != null) {
System.out.println("Extracting file: " + entry.getName());
try (FileOutputStream fos = new FileOutputStream(entry.getName())) {
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) >= 0) {
fos.write(buffer, 0, length);
}
}
}
System.out.println("Files extracted using Apache Commons Compress successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipArchiveInputStreamএবংZipArchiveEntryব্যবহার করে zip ফাইল থেকে ডেটা বের করা হচ্ছে এবংFileOutputStreamব্যবহার করে সেগুলো আউটপুট ফাইলে লেখা হচ্ছে।
- Java
java.util.zipপ্যাকেজ এবং Apache Commons Compress লাইব্রেরি ব্যবহারে আপনি সহজেই Zip Archive তৈরি এবং extract করতে পারেন। java.util.zipপ্যাকেজ সাধারণত zip ফাইলের সাথে কাজ করার জন্য ব্যবহৃত হয়, যেখানে Apache Commons Compress লাইব্রেরি আরও উন্নত এবং বিভিন্ন আর্কাইভ ফরম্যাট (যেমনtar,gz,bz2) সাপোর্ট করে।- Java Tuples ব্যবহার করে আর্কাইভ ফাইলের নাম, আকার ইত্যাদি তথ্য সংরক্ষণ করা যেতে পারে, যা পরে পর্যালোচনা এবং ব্যবহারের জন্য সহজ হয়।
ফাইল কমপ্রেশন (Compression) এবং ডিকমপ্রেশন (Decompression) হল এমন একটি প্রক্রিয়া যার মাধ্যমে ফাইলের আকার ছোট করা হয় এবং পরবর্তীতে মূল অবস্থায় ফিরে আনা হয়। Java-তে এই কাজগুলি করতে সাধারণত java.util.zip প্যাকেজ ব্যবহার করা হয়, যা gzip, zip এবং অন্যান্য ফাইল ফরম্যাটের সাথে কাজ করতে সহায়ক।
ফাইল কমপ্রেশন এবং ডিকমপ্রেশন প্রক্রিয়া সরাসরি Java Streams এবং Java NIO এর সাথে যুক্ত থাকে। এটি মূলত FileInputStream এবং FileOutputStream এর সাথে কাজ করে, তবে ডেটা কমপ্রেশন বা ডিকমপ্রেশন করার জন্য ZipOutputStream, ZipInputStream, GZIPOutputStream, এবং GZIPInputStream ব্যবহার করা হয়।
Java-তে File Compression এবং Decompression উদাহরণ
১. GZIP Compression এবং Decompression
Java তে GZIP ফাইল কমপ্রেশন এবং ডিকমপ্রেশন করার জন্য GZIPOutputStream এবং GZIPInputStream ক্লাস ব্যবহৃত হয়। এগুলি gzip ফরম্যাটে ফাইল কমপ্রেস এবং ডিকমপ্রেস করতে ব্যবহৃত হয়।
ফাইল কমপ্রেশন উদাহরণ (GZIP)
এই উদাহরণে, একটি সাধারণ টেক্সট ফাইল কমপ্রেস করা হবে GZIP ফরম্যাটে।
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
public class GzipCompressionExample {
public static void main(String[] args) {
// ফাইল কমপ্রেস করার জন্য GZIPOutputStream ব্যবহার করা
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.gz");
GZIPOutputStream gzipOS = new GZIPOutputStream(fos)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
gzipOS.write(buffer, 0, length); // ফাইল কমপ্রেস করা
}
System.out.println("File successfully compressed using GZIP.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
GZIPOutputStreamক্লাস ফাইল কমপ্রেস করার জন্য ব্যবহৃত হচ্ছে।input.txtফাইলটি GZIP ফরম্যাটেoutput.gzফাইলে কমপ্রেস করা হচ্ছে।
ফাইল ডিকমপ্রেশন উদাহরণ (GZIP)
এখন, GZIP ফাইল ডিকমপ্রেস করা হবে, যা আগে কমপ্রেস করা ছিল।
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
public class GzipDecompressionExample {
public static void main(String[] args) {
// GZIP ফাইল ডিকমপ্রেস করার জন্য GZIPInputStream ব্যবহার করা
try (FileInputStream fis = new FileInputStream("output.gz");
GZIPInputStream gzipIS = new GZIPInputStream(fis);
FileOutputStream fos = new FileOutputStream("decompressed.txt")) {
byte[] buffer = new byte[1024];
int length;
while ((length = gzipIS.read(buffer)) > 0) {
fos.write(buffer, 0, length); // ফাইল ডিকমপ্রেস করা
}
System.out.println("File successfully decompressed.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
GZIPInputStreamক্লাস ফাইল ডিকমপ্রেস করার জন্য ব্যবহৃত হচ্ছে।output.gzফাইলটিdecompressed.txtনামে ডিকমপ্রেস করা হচ্ছে।
২. Zip Compression এবং Decompression
ZipOutputStream এবং ZipInputStream ব্যবহার করে একাধিক ফাইল একটি ZIP ফাইলে কমপ্রেস করা যায় এবং পরে সেই ZIP ফাইল ডিকমপ্রেস করা যায়।
ফাইল কমপ্রেশন উদাহরণ (ZIP)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipCompressionExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("compressed.zip");
ZipOutputStream zipOS = new ZipOutputStream(fos)) {
// ফাইলের নাম এবং ডেটা সহ ZipEntry তৈরি
ZipEntry entry = new ZipEntry("input.txt");
zipOS.putNextEntry(entry);
try (FileInputStream fis = new FileInputStream("input.txt")) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zipOS.write(buffer, 0, length); // ফাইল কমপ্রেস করা
}
}
zipOS.closeEntry();
System.out.println("File successfully compressed to ZIP.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipOutputStreamব্যবহার করেinput.txtফাইলটিcompressed.zipনামক ZIP ফাইলে কমপ্রেস করা হচ্ছে।ZipEntryব্যবহার করে ফাইলের অন্তর্ভুক্তি (entry) তৈরি করা হচ্ছে ZIP ফাইলে।
ফাইল ডিকমপ্রেশন উদাহরণ (ZIP)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipDecompressionExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("compressed.zip");
ZipInputStream zipIS = new ZipInputStream(fis)) {
ZipEntry entry;
while ((entry = zipIS.getNextEntry()) != null) {
System.out.println("Unzipping: " + entry.getName());
try (FileOutputStream fos = new FileOutputStream(entry.getName())) {
byte[] buffer = new byte[1024];
int length;
while ((length = zipIS.read(buffer)) > 0) {
fos.write(buffer, 0, length); // ফাইল ডিকমপ্রেস করা
}
}
zipIS.closeEntry();
}
System.out.println("File successfully decompressed from ZIP.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ZipInputStreamব্যবহার করেcompressed.zipফাইলের ডেটা পড়া হচ্ছে এবং তার মধ্যে থাকাinput.txtফাইলটি ডিকমপ্রেস করা হচ্ছে।
- File Compression এবং Decompression হল এমন প্রক্রিয়া যা ডেটার আকার কমিয়ে দেয় এবং পরে এটি মূল অবস্থায় ফিরিয়ে আনে।
- Java I/O API থেকে
GZIPOutputStreamওZipOutputStreamব্যবহার করে আপনি ফাইল কমপ্রেস করতে পারেন, এবংGZIPInputStreamওZipInputStreamব্যবহার করে সেই ফাইল ডিকমপ্রেস করতে পারেন। - Java Streams এবং NIO লাইব্রেরি ব্যবহার করে আরও উন্নত এবং কার্যকরী ফাইল কমপ্রেশন এবং ডিকমপ্রেশন প্রক্রিয়া বাস্তবায়ন করা সম্ভব।
Read more