首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kotlin中创建一个ZIP文件

在Kotlin中创建一个ZIP文件
EN

Stack Overflow用户
提问于 2017-09-14 14:44:16
回答 7查看 15.6K关注 0票数 21

我正试图在Kotlin中创建一个zip文件。这是代码:

代码语言:javascript
复制
fun main(args: Array<String>) {
var files: Array<String> = arrayOf("/home/matte/theres_no_place.png", "/home/matte/vladstudio_the_moon_and_the_ocean_1920x1440_signed.jpg")
var out = ZipOutputStream(BufferedOutputStream(FileOutputStream("/home/matte/Desktop/test.zip")))
var data = ByteArray(1024)
for (file in files) {
    var fi = FileInputStream(file)
    var origin = BufferedInputStream(fi)
    var entry = ZipEntry(file.substring(file.lastIndexOf("/")))
    out.putNextEntry(entry)
    origin.buffered(1024).reader().forEachLine {
        out.write(data)
    }
    origin.close()
}
out.close()}

创建了zip文件,但是里面的文件已经损坏了!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2022-04-08 09:47:45

我不确定您是否想手动完成,但是我发现这个很好的库运行得很好:

https://github.com/zeroturnaround/zt-zip

这个库是Java库的一个很好的包装器,它包含用单个函数压缩/解压缩文件和目录的方法。

对于压缩单个文件,只需使用packEntry方法:

代码语言:javascript
复制
ZipUtil.packEntry(File("/tmp/demo.txt"), File("/tmp/demo.zip"))

对于压缩目录及其子目录的情况,可以使用pack方法:

代码语言:javascript
复制
val dirToCompress = Paths.get("/path/to/my/dir").toFile()
val targetOutput = Paths.get("/output/path/dir.zip").toFile()

ZipUtil.pack(dirToCompress, targetOutput)

压缩文件应该在指定的目标输出中创建。

您可以在图书馆文献中找到更多的细节和示例。

希望这对你有帮助

票数 1
EN

Stack Overflow用户

发布于 2017-09-14 15:20:17

如果您使用Kotlin的IOStreams.copyTo()扩展,它将为您完成复制工作,最终会为我工作。

因此,将其替换为:

代码语言:javascript
复制
origin.buffered(1024).reader().forEachLine {
    out.write(data)
}

在这方面:

代码语言:javascript
复制
origin.copyTo(out, 1024)

我也有问题,ZipEntry有一个领先的斜杠,但这可能只是因为我在Windows上。

注意:我最终不需要调用closeEntry()来使其工作,但建议这样做。

票数 13
EN

Stack Overflow用户

发布于 2017-09-15 07:13:49

我做了个混音:

代码语言:javascript
复制
fun main(args: Array<String>) {
    val files: Array<String> = arrayOf("/home/matte/theres_no_place.png", "/home/matte/vladstudio_the_moon_and_the_ocean_1920x1440_signed.jpg")
    ZipOutputStream(BufferedOutputStream(FileOutputStream("/home/matte/Desktop/test.zip"))).use { out ->
        for (file in files) {
            FileInputStream(file).use { fi ->
                BufferedInputStream(fi).use { origin ->
                    val entry = ZipEntry(file.substring(file.lastIndexOf("/")))
                    out.putNextEntry(entry)
                    origin.copyTo(out, 1024)
                }
            }
        }
    }
}

它工作得很完美!

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46222055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档