2017-09-14 98 views
3

我正在嘗試在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()} 

zip文件被創建,但裏面的文件已損壞!

回答

3

如果您使用Kotlin的IOStreams.copyTo()擴展名,它將爲您完成複製工作,並最終爲我工作。

所以替換此:

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

有了這個:

origin.copyTo(out, 1024) 

我也有問題,與具有斜線的ZipEntry,但是這可能僅僅是因爲我是在Windows上。

注意:我並沒有最終需要致電closeEntry()才能使其工作,但建議您使用此工具。

0

1)您正在爲輸入文件的每一行寫入一個空字節數組到out

2)BufferedReader沒有必要,因爲它足以讀取和寫入字節而不是行(這將導致解壓縮的內容不能與原始內容匹配)。

3)在例外的情況下,所有流都應該關閉。使用方法use像java中的try-with-resources。

4)val代替var有可能

5)不要使用絕對路徑除了快速測試片段。

6)該段是不是在科特林習慣的方法(見託德的回答)

因此,這是它應該如何工作(儘管在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) 
        } 
       } 
      } 
     } 
    } 
} 

編輯:我已經用我的文件運行了這個代碼片段,它工作正常。

0

我做了一個組合:

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

它完美的作品! 非常感謝!