Java তে ZipInputStream ক্লাস ব্যবহার করে আপনি একটি Zip ফাইল থেকে ডেটা আনজিপ করতে পারেন (uncompress)। ZipInputStream একটি স্ট্রিমিং API যা একটি Zip ফাইলের ভেতরের ফাইলগুলোকে একের পর এক প্রসেস করার জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি একাধিক ফাইল বা ফোল্ডারের ভিতরে থাকা কম্প্রেসড ডেটা পড়তে পারেন এবং এগুলোকে আনজিপ (uncompress) করতে পারেন।
ZipInputStream ব্যবহার করার প্রক্রিয়া
- Zip ফাইল খুলুন: প্রথমে Zip ফাইলটি খুলতে হবে একটি
ZipInputStreamঅবজেক্টের মাধ্যমে। - Zip এন্ট্রি (Entry) বের করুন: Zip ফাইলের ভিতরে প্রতিটি ফাইল বা ফোল্ডারকে একটি
ZipEntryহিসাবে সনাক্ত করা হয়। আপনি একে একে প্রতিটিZipEntryবের করে আনজিপ করতে পারবেন। - ফাইল পড়ুন এবং আনজিপ করুন: প্রতিটি
ZipEntryথেকে ডেটা পড়ুন এবং তা আনজিপ করা ফাইলে লিখুন।
উদাহরণ: ZipInputStream এর মাধ্যমে Zip ফাইল Uncompress করা
এখানে একটি উদাহরণ দেওয়া হলো, যেখানে একটি Zip ফাইলের সমস্ত ফাইল আনজিপ করা হবে:
import java.io.*;
import java.util.zip.*;
public class ZipUncompressExample {
public static void main(String[] args) {
String zipFilePath = "example.zip"; // Zip ফাইলের পাথ
String destDir = "output/"; // যেখানে আনজিপ করা ফাইলগুলি রাখা হবে
// ZipInputStream এবং FileOutputStream ব্যবহার করে ফাইল আনজিপ করা
try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath))) {
ZipEntry entry;
// Zip ফাইলের সমস্ত এন্ট্রি প্রক্রিয়া করুন
while ((entry = zipIn.getNextEntry()) != null) {
String fileName = entry.getName();
File newFile = new File(destDir + fileName);
// আউটপুট ফাইলের পাথ তৈরি করুন
new File(newFile.getParent()).mkdirs(); // ফোল্ডার যদি না থাকে, তাহলে তৈরি করুন
// FileOutputStream দিয়ে ফাইলটি আনজিপ করুন
try (FileOutputStream fos = new FileOutputStream(newFile)) {
byte[] buffer = new byte[1024];
int len;
// ফাইল থেকে ডেটা পড়ে আউটপুট ফাইলে লিখুন
while ((len = zipIn.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
}
// ZipEntry সম্পন্ন হলে এটিকে ক্লোজ করুন
zipIn.closeEntry();
}
System.out.println("Zip ফাইল সফলভাবে আনজিপ করা হয়েছে!");
} catch (IOException e) {
System.err.println("An error occurred: " + e.getMessage());
}
}
}
কোডের ব্যাখ্যা:
- Zip ফাইলের ইনপুট স্ট্রিম:
ZipInputStreamএকটিFileInputStreamএর মাধ্যমে Zip ফাইলটি খুলে।ZipInputStreamএ একের পর এক ফাইল বা ফোল্ডারের তথ্যZipEntryএর মাধ্যমে পড়া হয়।
- ZipEntry:
getNextEntry()মেথড ব্যবহার করে Zip ফাইলের প্রতিটি ফাইল বা ফোল্ডারের জন্য একটিZipEntryঅবজেক্ট পাওয়া যায়।ZipEntryএর মধ্যে ফাইলের নাম, ফাইলের সাইজ, এবং অন্যান্য মেটাডেটা থাকে।
- ফাইল আনজিপ করা:
- প্রতিটি
ZipEntryথেকে ডেটা পড়ার জন্যZipInputStream.read()ব্যবহার করা হয়। তারপর, এই ডেটা একটি আউটপুট ফাইলেFileOutputStreamএর মাধ্যমে লেখা হয়।
- প্রতিটি
- ফোল্ডার তৈরি:
- যদি
ZipEntryএকটি ফোল্ডার হয়, তবেnew File(newFile.getParent()).mkdirs()এর মাধ্যমে সেই ফোল্ডারটি তৈরি করা হয়।
- যদি
- সমাপ্তি:
zipIn.closeEntry()মেথড ব্যবহার করে প্রতিটিZipEntryবন্ধ করা হয়।
উদাহরণ ইনপুট (Zip ফাইল):
ধরা যাক, example.zip ফাইলটি একটি Zip ফাইল যার মধ্যে দুটি ফাইল রয়েছে:
file1.txtfile2.txt
আউটপুট (Uncompressed Files):
এখন, output/ ডিরেক্টরির মধ্যে আপনি দুটি আনজিপ করা ফাইল দেখতে পাবেন:
output/file1.txtoutput/file2.txt
গুরুত্বপূর্ণ পয়েন্টস:
ZipInputStreamএকটি স্ট্রিমিং API: এর মানে হলো, এটি একটি ফাইল থেকে একে একে ডেটা পড়তে পারে, যা মেমরি ব্যবস্থাপনায় সুবিধা দেয়।- ফোল্ডার স্ট্রাকচার: যদি Zip ফাইলে ফোল্ডার থাকে, তবে
ZipInputStreamএর মাধ্যমে সেই ফোল্ডারও আনজিপ করা সম্ভব। - Exception Handling:
IOExceptionএবং অন্যান্য সম্ভাব্য এক্সেপশন হ্যান্ডল করা উচিত যাতে প্রোগ্রাম চলাকালে কোনো সমস্যা না হয়।
Java তে ZipInputStream ব্যবহার করে সহজে Zip ফাইল থেকে ডেটা আনজিপ করা যায়। এটি স্ট্রিমিং API হওয়ায়, বড় Zip ফাইলগুলি কম মেমরি ব্যবহারের মাধ্যমে প্রসেস করতে সহায়তা করে।
ZipInputStream একটি Java ক্লাস যা java.util.zip প্যাকেজে অন্তর্ভুক্ত এবং এটি একটি ইনপুট স্ট্রিমের মাধ্যমে ZIP ফাইল থেকে ডেটা এক্সট্র্যাক্ট করতে ব্যবহৃত হয়। এটি বিশেষভাবে ZIP ফাইলের উপাদানগুলি (যেমন, ফাইল এবং ডিরেক্টরি) পড়ার জন্য ডিজাইন করা হয়েছে। ZipInputStream ব্যবহার করে আপনি একটি ZIP ফাইলের মধ্যে সংরক্ষিত ফাইলের প্রতি এন্ট্রি (entry) পড়তে পারেন এবং সেগুলিকে ডিকম্প্রেস বা এক্সট্র্যাক্ট করতে পারেন।
ZipInputStream এর ভূমিকা:
- ZIP ফাইলের মধ্যে ফাইল এক্সট্র্যাক্ট করা:
ZipInputStreamব্যবহার করে আপনি একটি ZIP ফাইলের বিভিন্ন ফাইল বা ডিরেক্টরি থেকে ডেটা পড়তে পারেন।- এটি ফাইলের প্রতিটি
ZipEntryপড়ে এবং তার মধ্যে থাকা ডেটা প্রক্রিয়া করে।
- ফাইলের এক্সট্র্যাকশন (Decompression):
ZipInputStreamকম্প্রেসড ZIP ফাইলের মধ্যে থাকা ডেটাকে ডিকম্প্রেস করে এবং তা অ্যাক্সেস করতে সাহায্য করে।- একে একে প্রতিটি ফাইল বা ডিরেক্টরি থেকে ডেটা বের করা হয়।
- ZIP এন্ট্রি পড়া:
ZipInputStreamপ্রতিটিZipEntryএন্ট্রি কে পড়ে এবং তার ভিতরে থাকা ডেটাInputStreamহিসাবে প্রদান করে।- প্রতিটি
ZipEntryএকটি ফাইল বা ডিরেক্টরি হতে পারে এবং এটি ZIP ফাইলের সংরক্ষিত ফাইল বা ডিরেক্টরির তথ্য ধারণ করে (যেমন, ফাইলের নাম, সাইজ, টাইমস্ট্যাম্প, ইত্যাদি)।
- ইভেন্ট ড্রিভেন পার্সিং:
ZipInputStreamএকটি স্ট্রিমিং API, অর্থাৎ এটি একটি ইভেন্ট ড্রিভেন পদ্ধতিতে কাজ করে। আপনি যখনZipInputStreamব্যবহার করেন, এটি স্বয়ংক্রিয়ভাবে ZIP ফাইলের প্রতিটি এন্ট্রি (entry) পড়ে এবং আপনাকে সেই অনুযায়ী ডেটা পরিচালনা করতে দেয়।
ZipInputStream এর ব্যবহার
এখানে একটি উদাহরণ দেওয়া হলো, যেখানে ZipInputStream ব্যবহার করে একটি ZIP ফাইল থেকে ফাইল এক্সট্র্যাক্ট করা হচ্ছে:
import java.io.*;
import java.util.zip.*;
public class ZipExtractExample {
public static void main(String[] args) {
String zipFilePath = "example.zip"; // উৎস Zip ফাইল
String outputDir = "output/"; // গন্তব্য ফোল্ডার
File dir = new File(outputDir);
if (!dir.exists()) {
dir.mkdir(); // গন্তব্য ফোল্ডার তৈরি করা
}
try (FileInputStream fis = new FileInputStream(zipFilePath);
ZipInputStream zis = new ZipInputStream(fis)) {
ZipEntry zipEntry;
while ((zipEntry = zis.getNextEntry()) != null) { // ZIP এন্ট্রি পেতে
File newFile = new File(outputDir, zipEntry.getName()); // ফাইলের গন্তব্য নির্ধারণ
// ফোল্ডার তৈরি করা
new File(newFile.getParent()).mkdirs();
// ফাইল লেখা
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile))) {
byte[] bytes = new byte[1024];
int length;
while ((length = zis.read(bytes)) >= 0) {
bos.write(bytes, 0, length); // ZIP ফাইল থেকে ডেটা এক্সট্র্যাক্ট করা
}
}
zis.closeEntry(); // এন্ট্রি বন্ধ করা
}
System.out.println("Zip ফাইল এক্সট্র্যাক্ট সফলভাবে করা হয়েছে।");
} catch (IOException e) {
System.out.println("ত্রুটি ঘটেছে: " + e.getMessage());
}
}
}
কোড ব্যাখ্যা:
- ZipInputStream তৈরি:
FileInputStreamএর মাধ্যমে ZIP ফাইলটি ওপেন করা হয় এবং এটিZipInputStreamএর মাধ্যমে পড়া হয়। - ZipEntry:
ZipInputStreamথেকে প্রতিটিZipEntry(ফাইল বা ডিরেক্টরি) পড়া হয়। এটি ZIP ফাইলের প্রতিটি ফাইল বা ডিরেক্টরি সম্পর্কে তথ্য ধারণ করে। - BufferedOutputStream: ZIP ফাইলের থেকে ডেটা এক্সট্র্যাক্ট করা হয় এবং তা একটি নতুন ফাইলে লেখা হয়।
- zis.getNextEntry(): এটি
ZipInputStreamথেকে পরবর্তীZipEntryনিয়ে আসে, যা ফাইলের নাম, সাইজ, টাইমস্ট্যাম্প এবং অন্যান্য মেটাডেটা ধারণ করে।
ZipInputStream এর কার্যকারিতা:
- ডেটা স্ট্রিমিং:
ZipInputStreamএকটি স্ট্রিমিং API, যেখানে আপনি একে একে ফাইলগুলিকে পড়তে পারেন। এটি একে একে সমস্ত এন্ট্রি (ফাইল বা ডিরেক্টরি) প্রসেস করে। - ফাইল এক্সট্র্যাক্ট করা: আপনি
ZipInputStreamব্যবহার করে ZIP ফাইলের মধ্যে থেকে ডেটা পড়তে এবং ডিকম্প্রেস করতে পারেন। এটি আর্কাইভ ফাইলের সকল তথ্য (ফাইল, নাম, মেটাডেটা) পড়ে এবং এক্সট্র্যাক্ট করে।
ZipInputStream এর সুবিধা:
- স্ট্রিমিং পার্সিং: ZIP ফাইলগুলি বড় হলে এটি মেমরি দক্ষ, কারণ এটি পুরো ফাইলটি মেমরিতে লোড না করে একে একে প্রতিটি এন্ট্রি পড়ে।
- ইভেন্ট ড্রিভেন: ZIP ফাইল থেকে ডেটা পড়ার জন্য
ZipInputStreamএকটি ইভেন্ট ড্রিভেন পদ্ধতি ব্যবহার করে, যা সহজে ফাইল প্রসেসিং করে। - ক্রস-প্ল্যাটফর্ম সমর্থন:
ZipInputStreamএকটি ক্রস-প্ল্যাটফর্ম সমাধান, তাই এটি বিভিন্ন অপারেটিং সিস্টেমে কার্যকরী।
ZipInputStream হল Java তে একটি শক্তিশালী ক্লাস যা ZIP ফাইল থেকে ডেটা এক্সট্র্যাক্ট করার জন্য ব্যবহৃত হয়। এটি মেমরি-দক্ষ এবং স্ট্রিমিং পার্সিং প্রযুক্তি ব্যবহার করে, যা বড় ZIP ফাইলের সাথে কাজ করতে সাহায্য করে। ZipInputStream এর মাধ্যমে আপনি সহজেই ZIP ফাইল থেকে ফাইল এক্সট্র্যাক্ট করতে পারেন এবং Java অ্যাপ্লিকেশনে ব্যবহার করতে পারেন।
Java তে Zip ফাইল থেকে ফাইল Extract করার জন্য java.util.zip প্যাকেজের ZipFile এবং ZipEntry ক্লাস ব্যবহার করা হয়। আপনি এই ক্লাসগুলো ব্যবহার করে ZIP ফাইল থেকে এক বা একাধিক ফাইল বের করতে পারেন। এখানে ZipFile ক্লাস দিয়ে ZIP ফাইল খুলে এবং ZipEntry ক্লাসের সাহায্যে ZIP ফাইলের এন্ট্রিগুলি এক্সট্রাক্ট করা হয়।
Zip ফাইল থেকে ফাইল Extract করার প্রক্রিয়া:
ধাপ ১: ZIP ফাইল খুলুন (ZipFile ক্লাস)
প্রথমে, ZipFile ক্লাস ব্যবহার করে ZIP ফাইলটি খুলুন। এটি একটি ZipFile অবজেক্ট তৈরি করবে যার মাধ্যমে আপনি ZIP ফাইলের ভিতরের সমস্ত এন্ট্রি অ্যাক্সেস করতে পারবেন।
ধাপ ২: ZIP ফাইলের এন্ট্রি গুলি পর্যালোচনা করুন (ZipEntry ক্লাস)
এরপর, ZIP ফাইলের প্রতিটি এন্ট্রি বা ফাইল বের করার জন্য ZipEntry ক্লাস ব্যবহার করা হয়। ZipFile থেকে entries() মেথড দিয়ে সমস্ত এন্ট্রি পাওয়া যাবে এবং তার পর প্রতিটি এন্ট্রিকে ইনপুট স্ট্রিমের মাধ্যমে বের করা যাবে।
ধাপ ৩: ফাইল Extract করুন (OutputStream ব্যবহার করে)
ZIP ফাইলের প্রতিটি এন্ট্রি বের করার পর, সেই ফাইলটি একটি লোকাল ফোল্ডারে সেভ করতে FileOutputStream এবং BufferedOutputStream ব্যবহার করা হয়।
Zip ফাইল থেকে ফাইল Extract করার একটি উদাহরণ:
import java.io.*;
import java.util.zip.*;
public class ZipExtractor {
public static void main(String[] args) {
String zipFilePath = "example.zip"; // ZIP ফাইলের পাথ
String outputDirectory = "output/"; // যেখানে ফাইলগুলো এক্সট্রাক্ট হবে
// ZIP ফাইল থেকে ফাইল এক্সট্রাক্ট করার প্রক্রিয়া
try (ZipFile zipFile = new ZipFile(zipFilePath)) {
// ZIP ফাইলের সমস্ত এন্ট্রি গুলি লোড করুন
zipFile.stream().forEach(entry -> {
// প্রতিটি এন্ট্রি (ফাইল) এক্সট্রাক্ট করুন
try {
extractFile(zipFile, entry, outputDirectory);
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
// ZIP ফাইল থেকে নির্দিষ্ট এন্ট্রি এক্সট্রাক্ট করার মেথড
private static void extractFile(ZipFile zipFile, ZipEntry entry, String outputDirectory) throws IOException {
// নির্দিষ্ট ফাইলের আউটপুট পাথ
File outputFile = new File(outputDirectory + entry.getName());
// ফোল্ডার তৈরি করুন যদি না থাকে
new File(outputFile.getParent()).mkdirs();
// ইনপুট স্ট্রিম তৈরি করুন
try (InputStream inputStream = zipFile.getInputStream(entry);
OutputStream outputStream = new FileOutputStream(outputFile)) {
// বাফারড স্ট্রিম ব্যবহার করে ফাইল কপি করুন
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
System.out.println("Extracted: " + entry.getName());
}
}
}
কোডের ব্যাখ্যা:
ZipFileক্লাস ব্যবহার করে ZIP ফাইলটি খুলেছি এবংzipFile.stream()দিয়ে সমস্ত এন্ট্রিগুলি পর্যালোচনা করছি।ZipEntryক্লাস ব্যবহার করে প্রতিটি এন্ট্রি (ফাইল) বের করেছি।extractFileমেথডে ইনপুট স্ট্রিম থেকে ফাইল ডেটা পড়ে এবং আউটপুট স্ট্রিমে (যে ডিরেক্টরিতে ফাইলটি এক্সট্রাক্ট হবে) সেই ডেটা লিখেছি।- ফোল্ডার সৃষ্টির ব্যবস্থা: যদি আউটপুট ডিরেক্টরি না থাকে, তবে ফোল্ডার তৈরি করা হচ্ছে।
প্রধান মেথডগুলো:
ZipFile.getInputStream(ZipEntry entry): ZIP ফাইলের একটি নির্দিষ্ট এন্ট্রি থেকে ইনপুট স্ট্রিম ফেরত দেয়, যার মাধ্যমে আপনি সেই এন্ট্রির ডেটা এক্সট্রাক্ট করতে পারবেন।ZipFile.stream(): এটিZipEntryগুলির স্ট্রিম ফেরত দেয় যা ZIP ফাইলের মধ্যে সব এন্ট্রি প্রসেস করার জন্য ব্যবহার করা হয়।
ফাইল এক্সট্রাকশন সম্পর্কে কিছু গুরুত্বপূর্ণ বিষয়:
- ফোল্ডার তৈরি: ফোল্ডার তৈরি করতে
mkdirs()মেথড ব্যবহার করা হয়েছে। এটা নিশ্চিত করে যে নির্দিষ্ট ডিরেক্টরি আগেই তৈরি না থাকলে তা তৈরি হবে। - Buffering:
BufferedOutputStreamএবংBufferedInputStreamব্যবহার করে ডেটা দ্রুত এবং কার্যকরভাবে কপি করা যায়, কারণ এটি ইন্ডিভিজ্যুয়াল বাইট পড়ার পরিবর্তে বাফার করে বড় ব্লক হিসেবে ডেটা হ্যান্ডেল করে। - অ্যাক্সেস প্রমিশন: নিশ্চিত করুন যে আপনার প্রোগ্রামটি যেখানে ফাইল এক্সট্রাক্ট করবে সেই ডিরেক্টরিতে লেখার অনুমতি আছে।
এটি Java তে একটি সাধারণ Zip ফাইল থেকে ফাইল Extract করার প্রক্রিয়া যা ZipFile এবং ZipEntry ক্লাস ব্যবহার করে সম্পন্ন করা হয়েছে। এই প্রক্রিয়াটি আপনাকে ZIP ফাইল থেকে একাধিক ফাইল বা একটি নির্দিষ্ট ফাইল সহজে বের করার সুযোগ দেয়।
ZipInputStream Java তে একটি স্ট্রিমিং API যা ZIP ফাইলের মধ্যে থাকা এন্ট্রির ডেটা পড়তে ব্যবহৃত হয়। এটি java.util.zip প্যাকেজের অংশ এবং ZIP ফাইলের বিভিন্ন ফাইল বা ডিরেক্টরি থেকে ডেটা বের করার জন্য ব্যবহৃত হয়। ZipInputStream এ তিনটি প্রধান মেথড রয়েছে যা ZIP ফাইলের এন্ট্রিগুলি প্রসেস করার জন্য গুরুত্বপূর্ণ:
getNextEntry():- কাজ: এই মেথডটি ZIP ফাইলের পরবর্তী এন্ট্রির (ফাইল বা ডিরেক্টরি) প্রতি পয়েন্টার সরিয়ে দেয় এবং সেই এন্ট্রির তথ্য ফিরিয়ে দেয়। এটি পরবর্তী এন্ট্রি পাওয়ার জন্য ব্যবহার করা হয়।
- ফিরিয়ে দেয়:
ZipEntryঅবজেক্ট, যা বর্তমান এন্ট্রির নাম, সাইজ, কম্প্রেশন মেথড এবং অন্যান্য মেটাডেটা ধারণ করে। - নোট:
getNextEntry()কখনোnullফিরিয়ে দিতে পারে যদি ZIP ফাইলে আর কোনো এন্ট্রি না থাকে।
উদাহরণ:
ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { System.out.println("Entry Name: " + entry.getName()); }read(byte[] b):- কাজ: এই মেথডটি
ZipInputStreamথেকে ডেটা পড়ে এবং এটি একটি বাইট অ্যারে হিসেবে ফিরিয়ে দেয়। - ফিরিয়ে দেয়: এটি একটি
intমান ফিরিয়ে দেয়, যা পড়া বাইটের সংখ্যা নির্দেশ করে (এটি 0 হতে পারে যদি কোনো বাইট না পড়া হয়)। - নোট:
read()মেথডের মাধ্যমে আপনি ZIP এন্ট্রির ভিতরের ডেটা ধারাবাহিকভাবে পড়তে পারেন। সাধারণত, এটি একাধিকবার কল করা হয় যতক্ষণ না পুরো এন্ট্রির ডেটা পড়া হয়।
উদাহরণ:
byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = zis.read(buffer)) != -1) { System.out.write(buffer, 0, bytesRead); }- কাজ: এই মেথডটি
closeEntry():- কাজ: এই মেথডটি বর্তমান ZIP এন্ট্রি বন্ধ করে এবং পরবর্তী এন্ট্রি পড়ার জন্য প্রস্তুত করে।
- ফিরিয়ে দেয়: এটি কোনো কিছু ফিরিয়ে দেয় না, তবে ZIP স্ট্রিমে এক এন্ট্রি প্রক্রিয়া শেষে অন্য এন্ট্রি শুরু করার জন্য এটি ব্যবহার করা হয়।
- নোট: এই মেথডটি
getNextEntry()অথবাread()এর পরে ব্যবহৃত হয়। যখন একটি ZIP এন্ট্রির সমস্ত ডেটা পড়া হয়, তখনcloseEntry()কল করা উচিত।
উদাহরণ:
zis.closeEntry(); // Close the current entry after processing it
ZipInputStream এর মেথডসমূহের ব্যাখ্যা:
getNextEntry():- কাজ: এটি ZIP ফাইলের পরবর্তী এন্ট্রি নির্বাচন করে, যার মধ্যে ফাইল বা ডিরেক্টরি থাকে। আপনি এই মেথডটি ব্যবহার করে ফাইলের মধ্যে সন্নিবেশিত প্রতিটি এন্ট্রির নাম এবং মেটাডেটা বের করতে পারেন।
- ব্যবহার:
getNextEntry()এর মাধ্যমে আপনি ZIP ফাইলের প্রতিটি এন্ট্রি একে একে পড়তে পারেন, এবং যখন একটির ডেটা সম্পূর্ণভাবে পড়ে ফেলা হয়, তখন পরবর্তী এন্ট্রি পড়তে পারেন।
read(byte[] b):- কাজ: এটি ZIP ফাইলের ভিতরে সংরক্ষিত ডেটা পড়তে ব্যবহৃত হয় এবং একটি বাইট অ্যারে ফিরিয়ে দেয়। এই মেথডটি এক বা একাধিক বার ব্যবহার করা হয় যতক্ষণ না আপনি একটি পুরো এন্ট্রির ডেটা পড়ে ফেলেন।
- ব্যবহার: এই মেথডের মাধ্যমে আপনি ZIP এন্ট্রি থেকে ডেটা পড়তে পারবেন এবং সেই ডেটা পরবর্তী প্রসেসিং বা লেখার জন্য ব্যবহার করতে পারবেন।
closeEntry():- কাজ: এটি ZIP স্ট্রিমে একটি নির্দিষ্ট এন্ট্রি বন্ধ করে, এবং পরবর্তী এন্ট্রি পড়ার জন্য প্রস্তুত হয়।
- ব্যবহার: যখন আপনি একটি এন্ট্রি সম্পূর্ণভাবে প্রসেস বা পড়া শেষ করেন, তখন আপনি
closeEntry()মেথড কল করতে পারেন যাতে পরবর্তী এন্ট্রি পড়া শুরু করা যায়। এটি একটি নির্দিষ্ট এন্ট্রি সম্পূর্ণভাবে বন্ধ করতে ব্যবহৃত হয়।
ZipInputStream এর মেথডসমূহের একটি পূর্ণ উদাহরণ:
import java.util.zip.*;
import java.io.*;
public class ZipInputStreamExample {
public static void main(String[] args) {
try {
// ZIP ফাইল খোলার জন্য স্ট্রিম তৈরি করা
FileInputStream fis = new FileInputStream("example.zip");
ZipInputStream zis = new ZipInputStream(fis);
// প্রতিটি ZIP এন্ট্রি পড়া
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Entry Name: " + entry.getName());
// যদি এন্ট্রি একটি ফাইল হয়, তবে তার ডেটা পড়া
if (!entry.isDirectory()) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = zis.read(buffer)) != -1) {
System.out.write(buffer, 0, bytesRead); // ডিসপ্লে ডেটা
}
}
zis.closeEntry(); // এন্ট্রি বন্ধ করা
}
zis.close(); // ZIP স্ট্রিম বন্ধ করা
} catch (IOException e) {
e.printStackTrace();
}
}
}
ZipInputStream এর getNextEntry(), read(byte[] b), এবং closeEntry() মেথডসমূহ ZIP ফাইলের মধ্যে থাকা এন্ট্রির ডেটা পড়তে ব্যবহৃত হয়। এগুলি ব্যবহার করে আপনি ZIP ফাইলের প্রতিটি এন্ট্রি একে একে প্রসেস করতে পারেন এবং শেষে সেগুলি বন্ধ করতে পারেন। ZipInputStream এর মাধ্যমে বড় ZIP ফাইলের ডেটা দ্রুত এবং কার্যকরভাবে পড়া সম্ভব হয়, কারণ এটি মেমরি দক্ষ এবং স্ট্রিম ভিত্তিক।
Java Zip প্যাকেজের মাধ্যমে ফাইল এবং ডিরেক্টরি Unzip করার জন্য আপনি ZipInputStream এবং ZipEntry ব্যবহার করতে পারেন। নিচে একটি প্র্যাকটিক্যাল উদাহরণ দেয়া হলো যেখানে একটি ZIP ফাইল থেকে ফাইল এবং ডিরেক্টরি আর্কাইভ করা হয়েছে এবং সেই ZIP ফাইল থেকে ফাইল এবং ডিরেক্টরি Unzip করা হচ্ছে।
ফাইল এবং ডিরেক্টরি Unzip করার উদাহরণ:
1. Unzip করার কোড (Zip ফাইল থেকে ফাইল এবং ডিরেক্টরি Unzip করা)
import java.io.*;
import java.util.zip.*;
public class UnzipExample {
public static void main(String[] args) {
String zipFilePath = "example.zip"; // ZIP ফাইলের পাথ
String destDir = "extracted/"; // Unzip করার গন্তব্য ডিরেক্টরি
// ডিরেক্টরি তৈরি করা, যদি তা না থাকে
File dir = new File(destDir);
if (!dir.exists()) {
dir.mkdir();
}
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) {
ZipEntry entry;
// ZIP ফাইলের প্রতিটি এন্ট্রি (ফাইল বা ডিরেক্টরি) একে একে প্রসেস করা
while ((entry = zis.getNextEntry()) != null) {
String entryName = entry.getName();
File newFile = new File(destDir + entryName);
// যদি এটি একটি ডিরেক্টরি হয়, তবে ডিরেক্টরি তৈরি করা
if (entry.isDirectory()) {
newFile.mkdir();
System.out.println("Directory created: " + entryName);
} else {
// ফাইল লেখার জন্য প্রক্রিয়া
// ফোল্ডার থাকলে তা তৈরি করা
new File(newFile.getParent()).mkdirs();
try (FileOutputStream fos = new FileOutputStream(newFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
System.out.println("File extracted: " + entryName);
}
}
// পরবর্তী এন্ট্রির জন্য প্রবেশ
zis.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Code Explanation:
- ZipInputStream:
ZipInputStreamব্যবহার করে ZIP ফাইল থেকে ডেটা রিড করতে শুরু করা হয়।new ZipInputStream(new FileInputStream(zipFilePath))দিয়ে ZIP ফাইলটি খোলা হয়।
- ZipEntry:
ZipInputStreamএরgetNextEntry()মেথড দিয়ে ZIP ফাইলের প্রতিটি এন্ট্রি (ফাইল বা ডিরেক্টরি) খোঁজা হয়।- প্রতিটি এন্ট্রি একটি
ZipEntryঅবজেক্ট হিসেবে পাওয়া যায়, যা ZIP ফাইলের ভিতরে থাকা একটি ফাইল বা ডিরেক্টরি প্রতিনিধিত্ব করে।
- Check if Directory:
ZipEntry.isDirectory()মেথড দিয়ে চেক করা হয় যে, এই এন্ট্রি একটি ডিরেক্টরি কিনা। যদি এটি একটি ডিরেক্টরি হয়, তাহলে সেই নামের একটি ডিরেক্টরি তৈরি করা হয়।
- Extract File:
- যদি এটি একটি ফাইল হয়, তবে ফাইলটি একটি নতুন ফাইল হিসেবে বের করা হয় এবং ফাইলের ডেটা
FileOutputStreamএর মাধ্যমে লেখা হয়।
- যদি এটি একটি ফাইল হয়, তবে ফাইলটি একটি নতুন ফাইল হিসেবে বের করা হয় এবং ফাইলের ডেটা
- Folder Creation:
- যদি ZIP ফাইলে একটি ফোল্ডার থাকে, তবে সেই ফোল্ডারটি তৈরি করা হয়।
new File(newFile.getParent()).mkdirs()এই লাইনটি ফোল্ডার তৈরি করতে ব্যবহার করা হয়।
- Error Handling:
- কোনো ধরণের
IOExceptionহলে সেটি ক্যাচ করে প্রিন্ট করা হয়।
- কোনো ধরণের
ফলাফল:
এই কোডটি একটি ZIP ফাইল থেকে ফাইল এবং ডিরেক্টরি আলাদা করে বের করবে এবং নির্দিষ্ট গন্তব্য ডিরেক্টরিতে সংরক্ষণ করবে।
উদাহরণ ZIP ফাইল:
ধরা যাক, আমাদের একটি example.zip ফাইল আছে, যার ভিতরে একটি ফাইল file1.txt এবং একটি ডিরেক্টরি folder1/ রয়েছে। ZIP ফাইলটি এমনভাবে স্ট্রাকচার করা হয়েছে:
example.zip
├── file1.txt
└── folder1/
└── file2.txt
Unzip করার পরে:
কোডটি চালানোর পরে extracted/ নামক ডিরেক্টরিতে এই স্ট্রাকচারটি থাকবে:
extracted/
├── file1.txt
└── folder1/
└── file2.txt
এই উদাহরণটি দেখিয়েছে কিভাবে একটি ZIP ফাইল থেকে ফাইল এবং ডিরেক্টরি বের করা যায় Java তে। ZipInputStream এবং ZipEntry এর সাহায্যে ফাইল ও ডিরেক্টরি Unzip করা খুবই সহজ এবং কার্যকরী। ZIP ফাইলের ভিতরে থাকা বিভিন্ন ধরনের এন্ট্রি (ফাইল বা ডিরেক্টরি) আলাদা করে বের করা এবং সেগুলি নির্দিষ্ট ডিরেক্টরিতে সংরক্ষণ করা সম্ভব।
Read more