在 Kotlin 中处理 ZIP/归档文件:ZIP-InputStream 和 ZipFile

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

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

开始课程

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

在现代 Kotlin (JVM) 开发中,经常需要打包或解压文件。Java 标准库通过 java.util.zip 包提供了强大的 ZIP 格式处理工具。本文将详细讲解如何使用 Kotlin 和 JVM 内置功能创建、读取和修改 ZIP 归档文件。



用于处理 ZIP 的主要类

在 Kotlin 中,处理 ZIP 归档文件主要使用 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("条目总数: ${

推荐