العمل مع أرشيفات ZIP في Kotlin: ZipInputStream و ZipFile

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع أرشيفات ZIP في Kotlin: دليل شامل

في التطوير الحديث باستخدام Kotlin (JVM)، غالبًا ما تنشأ الحاجة إلى ضغط أو فك ضغط الملفات. توفر مكتبة Java القياسية أدوات قوية للعمل مع تنسيق ZIP من خلال حزمة java.util.zip. في هذه المقالة، سنشرح بالتفصيل كيفية إنشاء وقراءة وتعديل أرشيفات ZIP باستخدام Kotlin والإمكانيات المدمجة في JVM.



الفئات الأساسية للعمل مع ZIP

للعمل مع أرشيفات ZIP في Kotlin، تُستخدم الفئات التالية من java.util.zip:

  • ZipOutputStream — لإنشاء أرشيفات ZIP جديدة وإضافة الملفات إليها.
  • ZipInputStream — لقراءة محتويات الأرشيف بشكل تسلسلي (وضع التدفق).
  • ZipFile — للوصول العشوائي إلى إدخالات الأرشيف (وصول عشوائي).
  • ZipEntry — يمثل إدخالاً فرديًا (ملف أو دليل) داخل الأرشيف.

جميع هذه الفئات مضمنة في مكتبة JDK القياسية، لذلك لا حاجة لأي تبعيات إضافية.



إنشاء أرشيف ZIP

لإنشاء أرشيف، يُستخدم ZipOutputStream الذي يغلف FileOutputStream. يتم إضافة كل ملف عبر ZipEntry.

import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipEntryimport java.util.zip.ZipOutputStream

fun createZipArchive(sourceDir: String, zipFilePath: String) { val dir = File(sourceDir) val files = dir.listFiles() ?: return ZipOutputStream(FileOutputStream(zipFilePath)).use { zos -> for (file in files) { if (file.isFile) { // إنشاء إدخال باسم الملف val entry = ZipEntry(file.name) zos.putNextEntry(entry) // نسخ محتوى الملف FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } } println("تم إنشاء الأرشيف: $zipFilePath")}

// مثال على الاستدعاءfun main() { createZipArchive("/path/to/source", "/path/to/archive.zip")}


فك ضغط أرشيف ZIP

يتم فك الضغط عبر ZipInputStream. نقرأ كل إدخال ونستعيد الملفات على القرص.

import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipInputStream

fun extractZipArchive(zipFilePath: String, outputDir: String) { val outputFolder = File(outputDir).also { it.mkdirs() } ZipInputStream(FileInputStream(zipFilePath)).use { zis -> var entry = zis.nextEntry while (entry != null) { val fileName = entry.name val outputFile = File(outputFolder, fileName) // إنشاء الدلائل الأصلية إذا لزم الأمر outputFile.parentFile?.mkdirs() // فك ضغط الملفات فقط (وليس الدلائل) if (!entry.isDirectory) { FileOutputStream(outputFile).use { fos -> zis.copyTo(fos) } } entry = zis.nextEntry } } println("تم فك ضغط الأرشيف في: $outputDir")}

// مثال على الاستدعاءfun main() { extractZipArchive("/path/to/archive.zip", "/path/to/extract")}


قراءة محتويات الأرشيف دون فك الضغط

لعرض الملفات داخل ZIP دون استخراجها، استخدم ZipFile والتكرار عبر entries().

import java.io.Fileimport java.util.zip.ZipFile

fun listZipContents(zipFilePath: String) { ZipFile(File(zipFilePath)).use { zipFile -> println("محتويات الأرشيف: ${zipFile.name}") println("إجمالي الإدخالات: ${

توصيات