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

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

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

ابدأ الدورة

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



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



لماذا نحتاج العمل مع الأرشيفات في Kotlin؟

  • توفير المساحة — ضغط البيانات عند التخزين على القرص.
  • سهولة النقل — أرشيف واحد بدلاً من ملفات متعددة.
  • الأمان — إمكانية التشفير (باستخدام مكتبات إضافية).
  • العمل مع الموارد — فك ضغط الإعدادات أو التحديثات.


الفئات الرئيسية في Java للعمل مع ZIP

Kotlin متوافق تمامًا مع Java، لذلك للعمل مع الأرشيفات نستخدم الفئات التالية من java.util.zip:

  • ZipOutputStream — لإنشاء أرشيف.
  • ZipInputStream — لقراءة أرشيف.
  • ZipEntry — يمثل ملفًا/مجلدًا فرديًا داخل الأرشفة.
  • ZipFile — فئة مناسبة لقراءة أرشيف موجود.


مثال 1: إنشاء أرشيف ZIP في Kotlin

سننشئ أرشيفًا يحتوي على عدة ملفات ومجلدات. نستخدم ZipOutputStream و BufferedOutputStream لتحسين الأداء.

import java.io.*import java.util.zip.*

fun createZipArchive( filesToZip: List<File>, outputZipPath: String) { ZipOutputStream(BufferedOutputStream(FileOutputStream(outputZipPath))).use { zos -> for (file in filesToZip) { if (file.isDirectory) { // إضافة مجلد فارغ zos.putNextEntry(ZipEntry("${file.name}/")) zos.closeEntry() continue } // إضافة ملف val entry = ZipEntry(file.name) zos.putNextEntry(entry) FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } println("تم إنشاء الأرشفة: $outputZipPath")}

fun main() { val files = listOf( File("document.txt"), File("image.png"), File("configs") // مجلد ) createZipArchive(files, "output.zip")}


مثال 2: قراءة محتويات أرشيف ZIP

لعرض قائمة الملفات داخل الأرشفة، من المناسب استخدام ZipFile.

import java.util.zip.ZipFile

fun listZipContents(zipPath: String) { ZipFile(zipPath).use { zip -> println("محتويات الأرشفة $zipPath:") zip.entries().asSequence().forEach { entry -> val size = if (entry.isDirectory) "مجلد" else "${entry.size} بايت" println("- ${entry.name} ($size)") } }}

fun main() { listZipContents("output.zip")}


مثال 3: فك ضغط أرشيف ZIP

سنستخرج جميع الملفات من الأرشفة إلى مجلد محدد. انتبه إلى معالجة المجلدات المتداخلة.

import java.io.*import java.util.zip.ZipInputStream

fun extractZip( zipPath: String, outputDir: String = "extracted") { val destDir = File(outputDir) destDir.mkdirs()

ZipInputStream(BufferedInputStream(FileInputStream(zipPath))).use { zis -> var entry = zis.nextEntry while (entry != null) { val file = File(destDir, entry.name) if (entry.isDirectory) { file.mkdirs() } else { // إنشاء المجلدات الأصلية file.parentFile?.mkdirs() BufferedOutputStream(Fi

توصيات