1. 使用 java.util.zip

Kotlin 作为 JVM 语言,天然支持使用 Java 的标准库来操作 ZIP 文件。java.util.zip 是 JDK 自带的包,提供了对 ZIP 文件读写的基本能力。

以下是一个使用 ZipOutputStream 创建 ZIP 文件的示例方法:

fun createZipFile(files: List<File>, outputZipFile: File): File {
    ZipOutputStream(FileOutputStream(outputZipFile)).use { zipOut ->
        files.forEach { file ->
            FileInputStream(file).use { fis ->
                val zipEntry = ZipEntry(file.name)
                zipOut.putNextEntry(zipEntry)
                fis.copyTo(zipOut)
                zipOut.closeEntry()
            }
        }
    }
    return outputZipFile
}

关键点说明:

✅ 使用 use 确保流自动关闭
✅ 每个文件创建一个 ZipEntry,然后写入 ZIP 流中
copyTo() 是 Kotlin 标准库提供的便捷方法,简化了流的复制操作

测试代码:

val filesToZip = listOf(
    File("file1.txt").apply { writeText("Hello, World!") },
    File("file2.txt").apply { writeText("Kotlin ZIP Test") }
)

@Test
fun `create zip file with java standard library`() {
    val outputZipFile = createZipFile(filesToZip, File("test_output.zip"))

    assertTrue(outputZipFile.exists())
    assertTrue(outputZipFile.length() > 0)

    filesToZip.forEach { it.delete() }
    outputZipFile.delete()
}

这个测试验证了 ZIP 文件是否成功创建,并非空文件。最后删除测试文件进行清理。


2. 使用 Apache Commons Compress

如果你需要更强大的 ZIP 支持,比如支持更多压缩格式、加密等高级功能,可以考虑使用 Apache Commons Compress。它提供了更灵活的 API 和更全面的功能。

以下是使用 ZipArchiveOutputStream 创建 ZIP 文件的示例方法:

fun createZipFileWithApache(files: List<File>, outputZipFile: File): File {
    ZipArchiveOutputStream(outputZipFile).use { zipOut ->
        files.forEach { file ->
            FileInputStream(file).use { fis ->
                IOUtils.copy(fis, zipOut)
            }
        }
        zipOut.closeArchiveEntry()
    }

    return outputZipFile
}

关键点说明:

✅ 使用 ZipArchiveOutputStream 替代原生 ZipOutputStream
IOUtils.copy() 是 Apache Commons IO 提供的工具方法
✅ 更简洁的 API,但功能更强大,适合复杂场景

测试代码:

@Test
fun `create zip file with apache commons compress`() {
    val outputZipFile = createZipFileWithApache(filesToZip, File("test_output_with_apache.zip"))

    assertTrue(outputZipFile.exists())
    assertTrue(outputZipFile.length() > 0)

    filesToZip.forEach { it.delete() }
    outputZipFile.delete()
}

3. 使用 Zip4j

如果你需要支持加密、密码保护、AES 加密等功能,推荐使用 Zip4j。它是 Java/Kotlin 社区中非常流行的 ZIP 操作库。

3.1 添加依赖

Maven:

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>2.8.0</version>
</dependency>

Gradle:

dependencies {
    implementation("net.lingala.zip4j:zip4j:2.8.0")
}

3.2 创建 ZIP 文件

fun createZipFileWithZip4j(files: List<File>, outputZipFile: File): File {
    val zipFile = ZipFile(outputZipFile)
    val parameters = ZipParameters().apply {
        compressionMethod = CompressionMethod.DEFLATE
        compressionLevel = CompressionLevel.NORMAL
    }
    zipFile.addFiles(files, parameters)

    return outputZipFile
}

关键点说明:

ZipParameters 可以配置压缩方式和压缩级别
ZipFile 类封装了流操作,简化了 ZIP 文件创建流程
✅ 支持密码保护(需额外配置 parameters

测试代码:

@Test
fun `create zip file with Zip4j library`() {
    val outputZipFile = File("test_output_with_zip4j.zip")

    createZipFileWithZip4j(filesToZip, outputZipFile)

    assertTrue(outputZipFile.exists())
    assertTrue(outputZipFile.length() > 0)

    filesToZip.forEach { it.delete() }
    outputZipFile.delete()
}

4. 总结

在 Kotlin 中创建 ZIP 文件有以下几种方式:

方法 优点 缺点
java.util.zip 原生支持,无需引入依赖 功能有限,API 繁琐
Apache Commons Compress 功能丰富,支持多种压缩格式 需引入额外依赖
Zip4j 支持加密、密码保护、AES 等高级功能 第三方库,需要熟悉其 API

推荐使用场景:

  • 简单压缩:使用 java.util.zip
  • 更多格式支持:使用 Apache Commons Compress
  • 需要加密/密码保护:使用 Zip4j

所有示例代码均可在 GitHub 上找到。


原始标题:Create a ZIP File in Kotlin