kotlin中使用zip 壓縮和解壓

使用操作系統工具進行壓縮和解壓,總會出現意料之外的問題,例如 mac 上的__MAXOS的文件夾,windows中的中文文件名的編碼問題,所以這類壓縮文件最好使用代碼去操作。

代碼如下,測試時,可以使用build文件夾輔助測試


class ZipUtil {
    val TAG = "ZipUtil"

    @Test
    fun testZipFile() {
        val f1 = File("./build/ziptest/中文.txt")
        createFile(f1.path)
        val f2 = File("./build/ziptest/2.txt")
        createFile(f2.path)
        val f3 = File("./build/ziptest/3.txt")
        createFile(f3.path)

        zip(listOf(f1, f2, f3), "./build/ziptest.zip")

        val res = "./build/zipresult"
        unzip("./build/ziptest.zip", res)
        Assert.assertEquals(3, File(res).listFiles().size)
    }

    @Test
    fun mp3Zip() {
        val files = File("./build/douyin_music").listFiles().toList()
        zip(files, "./build/douyin.zip")

        unzip("./build/douyin.zip", "./build/douyin_res")

        Assert.assertEquals(files.size, File("./build/douyin_res").listFiles().size)
    }

    /**
     * http://www.lxweimin.com/p/2adf4a4b1bd8
     */
    fun unzip(zipFile: String, descDir: String) {
        val buffer = ByteArray(1024)
        var outputStream: OutputStream? = null
        var inputStream: InputStream? = null
        try {
            val zf = ZipFile(zipFile)
            val entries = zf.entries()
            while (entries.hasMoreElements()) {
                val zipEntry: ZipEntry = entries.nextElement() as ZipEntry
                val zipEntryName: String = zipEntry.name

                inputStream = zf.getInputStream(zipEntry)
                val descFilePath: String = descDir + File.separator + zipEntryName
                val descFile: File = createFile(descFilePath)
                outputStream = FileOutputStream(descFile)

                var len: Int
                while (inputStream.read(buffer).also { len = it } > 0) {
                    outputStream.write(buffer, 0, len)
                }
                inputStream.closeQuietly()
                outputStream.closeQuietly()
            }
        } finally {
            inputStream?.closeQuietly()
            outputStream?.closeQuietly()
        }
    }

    private fun createFile(filePath: String): File {
        val file = File(filePath)
        val parentFile = file.parentFile!!
        if (!parentFile.exists()) {
            parentFile.mkdirs()
        }
        if (!file.exists()) {
            file.createNewFile()
        }
        return file
    }

    fun zip(files: List<File>, zipFilePath: String) {
        if (files.isEmpty()) return

        val zipFile = createFile(zipFilePath)
        val buffer = ByteArray(1024)
        var zipOutputStream: ZipOutputStream? = null
        var inputStream: FileInputStream? = null
        try {
            zipOutputStream = ZipOutputStream(FileOutputStream(zipFile))
            for (file in files) {
                if (!file.exists()) continue
                zipOutputStream.putNextEntry(ZipEntry(file.name))
                inputStream = FileInputStream(file)
                var len: Int
                while (inputStream.read(buffer).also { len = it } > 0) {
                    zipOutputStream.write(buffer, 0, len)
                }
                zipOutputStream.closeEntry()
            }
        } finally {
            inputStream?.close()
            zipOutputStream?.close()
        }
    }

    fun zipByFolder(fileDir: String, zipFilePath: String) {
        val folder = File(fileDir)
        if (folder.exists() && folder.isDirectory) {
            val files = folder.listFiles()
            val filesList: List<File> = files.toList()
            zip(filesList, zipFilePath)
        }
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。