日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

kotlin对ZipInputStream与ZipOutputStream的一些拓展工具(压缩,解压)

發布時間:2025/5/22 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kotlin对ZipInputStream与ZipOutputStream的一些拓展工具(压缩,解压) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用方法:通過file或流直接創建ZipInputStream ZipOutputStream

val zipOut = File("C:\\Users\\admin\\Desktop\\output.zip").zipOutputStream() val zipIn = File("C:\\Users\\admin\\Desktop\\output.zip").zipInputStream() val zipOut = xxOutputStream.zipOutputStream() val zipIn = xxInputStream.zipInputStream() 復制代碼

對多文件,文件夾進行壓縮處理(支持空文件夾)

File("C:\\Users\\admin\\Desktop\\output.zip").zipOutputStream().zipFrom("C:\\Users\\admin\\Desktop\\SophixPatchTool_windows","F:\\MUSIC\\Justin Bieber - Love Yourself.flac") //上述代碼將SophixPatchTool_windows文件夾與Justin Bieber - Love Yourself.flac壓縮到C:\\Users\\admin\\Desktop\\output.zip目錄下復制代碼

將zip文件壓縮到指定目錄

將zip文件壓縮到指定目錄C:\\Users\\admin\\Desktop\\66 File("C:\\Users\\admin\\Desktop\\output.zip").unZipTo("C:\\Users\\admin\\Desktop\\66") 或者 File("C:\\Users\\admin\\Desktop\\output.zip") unZipTo "C:\\Users\\admin\\Desktop\\66" 復制代碼

代碼主要是一些遞歸的算法,以及大量使用了kotlin的拓展函數,并且使用了中綴表達式 并沒有比較難的地方,代碼貼上

fun File.zipInputStream() = ZipInputStream(this.inputStream())fun File.zipOutputStream() = ZipOutputStream(this.outputStream())fun InputStream.zipInputStream() = ZipInputStream(this)fun OutputStream.zipOutputStream() = ZipOutputStream(this)infix fun File.unZipTo(path: String) {//使用GBK編碼,避免壓縮中文文件名亂碼checkUnzipFolder(path)ZipFile(this, Charset.forName("GBK")) unZipTo path }infix fun ZipFile.unZipTo(path: String) {checkUnzipFolder(path)for (entry in entries()) {//判斷是否為文件夾if (entry.isDirectory) {File("${path}/${entry.name}").mkdirs()} else {val input = getInputStream(entry)val outputFile = File("${path}/${entry.name}")if (!outputFile.exists()) outputFile.smartCreateNewFile()val output = outputFile.outputStream()input.writeTo(output, DEFAULT_BUFFER_SIZE)}} }/*** 檢查路徑正確性*/ private fun checkUnzipFolder(path: String) {val file = File(path)if (file.isFile) throw RuntimeException("路徑不能是文件")if (!file.exists()) {if (!file.mkdirs()) throw RuntimeException("創建文件夾失敗")} }fun ZipOutputStream.zipFrom(vararg srcs: String) {val files = srcs.map { File(it) }files.forEach {if (it.isFile) {zip(arrayOf(it), null)} else if (it.isDirectory) {zip(it.listFiles(), it.name)}}this.close() }private fun ZipOutputStream.zip(files: Array<File>, path: String?) {//前綴,用于構造路徑val prefix = if (path == null) "" else "$path/"if (files.isEmpty()) createEmptyFolder(prefix)files.forEach {if (it.isFile) {val entry = ZipEntry("$prefix${it.name}")val ins = it.inputStream().buffered()putNextEntry(entry)ins.writeTo(this, DEFAULT_BUFFER_SIZE, closeOutput = false)closeEntry()} else {zip(it.listFiles(), "$prefix${it.name}")}} }/*** inputstream內容寫入outputstream*/ fun InputStream.writeTo(outputStream: OutputStream, bufferSize: Int = 1024 * 2,closeInput: Boolean = true, closeOutput: Boolean = true) {val buffer = ByteArray(bufferSize)val br = this.buffered()val bw = outputStream.buffered()var length = 0while ({ length = br.read(buffer);length != -1 }()) {bw.write(buffer, 0, length)}bw.flush()if (closeInput) {close()}if (closeOutput) {outputStream.close()} }/*** 生成一個壓縮文件的文件夾*/ private fun ZipOutputStream.createEmptyFolder(location: String) {putNextEntry(ZipEntry(location))closeEntry() }fun File.smartCreateNewFile(): Boolean {if (exists()) return trueif (parentFile.exists()) return createNewFile()if (parentFile.mkdirs()) {if (this.createNewFile()) {return true}}return false }復制代碼

總結

以上是生活随笔為你收集整理的kotlin对ZipInputStream与ZipOutputStream的一些拓展工具(压缩,解压)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。