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 上找到。