在 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