العمل مع أرشيفات ZIP في Java: java.util.zip و Zip4j
ضغط البيانات وأرشفتها هي إحدى المهام الأساسية عند تطوير التطبيقات بلغة Java. تُستخدم أرشيفات ZIP على نطاق واسع لتعبئة الملفات، ونقل البيانات عبر الشبكة، وتوفير مساحة التخزين. في هذه المقالة، سنستعرض بالتفصيل طريقتين رئيسيتين للعمل مع أرشيفات ZIP في Java: الحزمة المضمنة java.util.zip والمكتبة الخارجية القوية Zip4j.
الحزمة القياسية java.util.zip
منذ JDK 1.1، تتوفر في Java حزمة java.util.zip التي توفر فئات أساسية للعمل مع تنسيق ZIP. الفئات الرئيسية:
ZipOutputStream— لإنشاء أرشيفات ZIPZipInputStream— لقراءة أرشيفات ZIPZipEntry— تمثل إدخالاً فردياً (ملفاً أو مجلداً) داخل الأرشيفZipFile— للوصول العشوائي إلى محتويات الأرشيف
إنشاء أرشيف ZIP باستخدام java.util.zip
import java.io.*;import java.util.zip.*;
public class ZipCreator { public static void main(String[] args) throws IOException { String sourceFile = "document.txt"; String zipName = "archive.zip";
try (FileOutputStream fos = new FileOutputStream(zipName); ZipOutputStream zos = new ZipOutputStream(fos)) {
File fileToZip = new File(sourceFile); FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.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(); } System.out.println("تم إنشاء الأرشيف: " + zipName); }}فك ضغط أرشيف ZIP
import java.io.*;import java.util.zip.*;
public class ZipExtractor { public static void main(String[] args) throws IOException { String zipFile = "archive.zip"; String outputDir = "extracted";
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()); new File(newFile.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(newFile); byte[] buffer = new byte[1024]; int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); zis.closeEntry(); } } System.out.println("تم إكمال فك الضغط في المجلد: " + outputDir); }}قيود java.util.zip:
- لا يدعم التشفير (الحماية بكلمة مرور)
- دعم محدود لـ Unicode في أسماء الملفات (قبل Java 7)
- عدم دعم ZIP64 للأرشيفات > 4 جيجابايت (قبل Java 8)
- صعوبة التعامل مع المجلدات المتداخلة
مكتبة Zip4j — إمكانيات متقدمة
Zip4j هي مكتبة خارجية شهيرة مفتوحة المصدر تعالج معظم قيود الحزمة القياسية. لإضافتها، أضف التبعية في Maven:
<dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>2.11.5</version></dependency>إنشاء أرشيف ZIP مشفر باستخدام Zip4j
import net.lingala.zip4j.ZipFile;import net.lingala.zip4j.model.ZipParam