在 Kotlin 中处理 ZIP/归档文件:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Kotlin 中处理 ZIP/归档文件:完整指南



在现代 Kotlin 开发中(尤其是针对 JVM 和 Android),经常需要处理 ZIP 归档文件:打包日志、解压资源、创建备份或以压缩形式传输数据。在本文中,我们将详细讲解如何使用 Java 内置功能(java.util.zip 包)在 Kotlin 中处理 ZIP 归档文件,并介绍一些便捷的扩展和替代方案。



为什么需要在 Kotlin 中处理归档文件?

  • 节省空间 — 在磁盘上存储时压缩数据。
  • 便于传输 — 一个归档文件代替多个文件。
  • 安全性 — 支持加密(借助额外库)。
  • 资源处理 — 解压配置或更新文件。


用于处理 ZIP 的 Java 主要类

Kotlin 与 Java 完全兼容,因此我们使用以下来自 java.util.zip 的类来处理归档文件:

  • ZipOutputStream — 用于创建归档文件。
  • ZipInputStream — 用于读取归档文件。
  • ZipEntry — 表示归档文件中的单个文件/文件夹。
  • ZipFile — 用于读取现有归档文件的便捷类。


示例 1:在 Kotlin 中创建 ZIP 归档文件

创建一个包含多个文件和文件夹的归档文件。使用 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

推荐