العمل مع أرشيفات 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