العمل مع أرشيفات ZIP في Java: دليل كامل لـ java.util.zip
أرشفة البيانات هي إحدى المهام الأساسية في تطوير البرمجيات. توفر Java مجموعة أدوات قوية ومرنة للعمل مع أرشيفات ZIP "مباشرة من الصندوق" — حزمة java.util.zip. في هذه المقالة، سنشرح بالتفصيل كيفية إنشاء وفك ضغط وتعديل أرشيفات ZIP باستخدام الأدوات القياسية في Java.
الفئات الرئيسية لحزمة java.util.zip
تحتوي حزمة java.util.zip على الفئات الأساسية للعمل مع الأرشيفات:
- ZipOutputStream — لإنشاء أرشيفات ZIP (كتابة الملفات إلى الأرشيف)
- ZipInputStream — لقراءة وفك ضغط أرشيفات ZIP
- ZipEntry — يمثل إدخالاً فردياً (ملف/مجلد) داخل الأرشيف
- ZipFile — للوصول المباشر إلى محتويات الأرشيف دون فك ضغط كامل
- CheckedOutputStream / CheckedInputStream — للتحقق من سلامة البيانات (CRC32, Adler32)
إنشاء أرشيف ZIP (ZipOutputStream)
لإنشاء أرشيف، يُستخدم ZipOutputStream الذي يغلف FileOutputStream العادي. يتم تمثيل كل ملف مضاف بواسطة كائن ZipEntry.
import java.io.*;import java.util.zip.*;
public class CreateZip { public static void main(String[] args) throws IOException { String[] sourceFiles = {"file1.txt", "file2.txt", "image.png"}; String zipName = "archive.zip";
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipName))) { byte[] buffer = new byte[1024];
for (String filePath : sourceFiles) { File file = new File(filePath); FileInputStream fis = new FileInputStream(file);
// إنشاء إدخال في الأرشيف ZipEntry zipEntry = new ZipEntry(file.getName()); zos.putNextEntry(zipEntry);
// كتابة محتويات الملف int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } zos.closeEntry(); fis.close(); System.out.println("تمت الإضافة: " + file.getName()); } } System.out.println("تم إنشاء الأرشيف: " + zipName); }}ملاحظات مهمة عند إنشاء الأرشيف:
- استدعِ دائماً
putNextEntry()قبل كتابة البيانات وcloseEntry()بعدها - لإضافة مجلد فارغ، استخدم
ZipEntry(name + "/")— يجب أن ينتهي الاسم بـ "/" - استخدم try-with-resources للإغلاق التلقائي للتيارات
فك ضغط أرشيف ZIP (ZipInputStream)
لاستخراج الملفات من الأرشيف، يُستخدم ZipInputStream. تتم القراءة بشكل تسلسلي — إدخال تلو الآخر.
import java.io.*;import java.util.zip.*;
public class ExtractZip { public static void main(String[] args) throws IOException { String zipFile = "archive.zip"; String outputDir = "extracted";
File dir = new File(outputDir); if (!dir.exists()) dir.mkdirs();
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) { ZipEntry entry; byte[] buffer = new byte[1024];
while ((entry = zis.getNextEntry()) != null) { String fileName = entry.getName(); File newFile = new File(outputDir + File.separator + fileName);
// إنشاء المجلدات الأصلية new File(newFile.getParent()).mkdirs();
// كتابة الملف FileOutputStream fos = new FileOutputStream(newFile); int length;