在Kotlin创建文件ZIP

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

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()} 

压缩文件被创建,但里面的文件已损坏!

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

所以替换这个:

 origin.buffered(1024).reader().forEachLine { out.write(data) } 

有了这个:

 origin.copyTo(out, 1024) 

我也有问题与ZipEntry有一个主要的斜杠,但这可能是因为我在Windows上。

注:我没有结束需要调用closeEntry()来得到这个工作,但建议。

1)您正在为输入文件的每一行写出一个空的字节数组。

2) BufferedReader没有必要,因为它足以读取和写入字节而不是行(这将导致解压缩的内容不能与原始的匹配)。

3)在例外的情况下,所有的流都应该关闭。 在java中使用方法use像试用资源。

4) val而不是var有可能

5)除了快速测试片段之外,不要使用绝对路径。

6)这段代码对于Kotlin而言并不是一种惯用的方式(参见托德的答案)

所以这就是它应该如何工作(尽管以Java的方式):

 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 -> val data = ByteArray(1024) for (file in files) { FileInputStream(file).use { fi -> BufferedInputStream(fi).use { origin -> val entry = ZipEntry(file) out.putNextEntry(entry) while (true) { val readBytes = origin.read(data) if (readBytes == -1) { break } out.write(data, 0, readBytes) } } } } } } 

编辑:我已经跑了这个片段与我的文件,它工作正常。

我做了一个混合:

 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) } } } } } 

它完美的作品! 非常感谢两个!

Interesting Posts