kotlin对ZipInputStream与ZipOutputStream的一些拓展工具(压缩,解压)
生活随笔
收集整理的這篇文章主要介紹了
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的一些拓展工具(压缩,解压)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java过滤乱码 \u形式乱码 unic
- 下一篇: hadoop(9)--MapReduce