使用方法:通过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的一些拓展工具(压缩,解压)相关推荐

  1. 用ZipInputStream和ZipOutputStream实现文件及文件夹的压缩解压

    主要是运用ZipInputStream和ZipOutputStream实现 当中要注意,在文件解压时,ZipEntry中的名字是相对路径 File的方法createNewFile()只能在存在的目录下 ...

  2. java zipinputstream_Java之解压流(ZipInputStream)

    /** * 提供给用户使用的解压工具 * @param srcPath * @param outPath * @throws IOException*/ public static voiddecom ...

  3. 超好用的电脑浏览器广告去除拓展工具

    拓展工具名字叫 AdGuard 下载地址: https://www.extfans.com/productivity/bgnkhhnnamicmpeenaelnjfhikgbkllg/download ...

  4. http://nian.so/#网站的拓展工具编写

    这个网站叫做念我用了很久,有安卓和ios版本,我对网页版进行了处理: 写了此社交网站的一个拓展工具. 功能–:对自己或者他人的进展页面内容进行处理,可以筛选关键字.不需要可以隐藏.简单有效.其他页面无 ...

  5. Android Zip 解压与进度 实现,kotlin命令行输入值

    String pathFileName = ""; while ((mZipEntry = zipInputStream.getNextEntry()) != null){ //获 ...

  6. Java ZipOutputStream 的使用,实现压缩文件

    Java 压缩文件主要通过 ZipOutputStream 实现,ZipOutputStream 有 5 个关键的方法: putNextEntry() 向压缩包中添加子文件,并设置文件路径和名称(压缩 ...

  7. 关键词挖掘工具_关键词拓展工具集合

    优化网站的关键词,首先要建立关键词库,那么要拓展和挖掘海量的关键词,我们除了手动去搜索引擎里搜索,收集下拉框.相关搜索,还有没有更丰富的关键词挖掘工具呢?那么,今天网睿seo公司的就会给大家分享下目前 ...

  8. php反序列化拓展攻击详解

    2019-11-11 16:51 文章首发于先知社区:https://xz.aliyun.com/t/6699 前言 继上篇对thinkphp5版本反序列化pop链详细分析后,对tp的反序列化漏洞有了 ...

  9. 解决 Java ZipOutputStream 压缩的包winrar 无法正常解压

    问题 使用ZipOutputStream生成的zip包,使用360解压可以正常解压,使用windors自带的解压工具会报错(压缩(zipped)文件夹xxx.zip无效). 原因 原因是winrar解 ...

最新文章

  1. gradle第二天(Building a RESTful Web Service)
  2. [原创] hadoop学习笔记:wordcout程序实践
  3. 生产环境JVM内存大小配置
  4. Nhibernate 基础关系映射
  5. 【转】hadoop深入研究:(十一)——序列化与Writable实现
  6. (转)64bit上安装32位oracle 10 g出现错误:无法定位承诺工序输入点 getprocessimagifilenamew 于动态链接库PSAPI.DLL...
  7. 计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...
  8. Object.prototype 原型和原型链
  9. IntelliJ IDEA 2020.1 瞬间定位文件夹、文件
  10. 利用XML文件的一个写日志的类!!!!!
  11. matlab界面语言修改
  12. pycharm中实现sin和cos函数曲线图
  13. VirtualBox 安装教程
  14. Comsol with Matlab
  15. 射频识别技术漫谈(4)——数据编码
  16. 自己的微信小程序学习笔记【1】——小程序开发工具的使用及项目文件说明
  17. 防火墙、DCD与TCP Keep alive
  18. (Scikit-Learn)线性回归 基函数的含义详解
  19. NDN网络学习笔记(一)——NDN基础
  20. P3258 [JLOI2014] 松鼠的新家 题解

热门文章

  1. shell实例第12讲:给定目录找出包含关键字的文件
  2. 去除字符串中指定字符
  3. <LINUX内核完全剖析:基于0.12内核> 笔记一
  4. springmvc二十五:springmvc支持ajax
  5. 聊聊flink的ConnectionManager
  6. 雅虎开源发布/订阅消息平台Pulsar
  7. Excel中Sumproduct函数的使用方法
  8. 手游研发CJ抱大腿指南
  9. Oracle OS Block Header
  10. C语言复杂的学生成绩管理系统,哭诉、拜求C语言学生成绩管理系统