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的一些拓展工具(压缩,解压)相关推荐
- 用ZipInputStream和ZipOutputStream实现文件及文件夹的压缩解压
主要是运用ZipInputStream和ZipOutputStream实现 当中要注意,在文件解压时,ZipEntry中的名字是相对路径 File的方法createNewFile()只能在存在的目录下 ...
- java zipinputstream_Java之解压流(ZipInputStream)
/** * 提供给用户使用的解压工具 * @param srcPath * @param outPath * @throws IOException*/ public static voiddecom ...
- 超好用的电脑浏览器广告去除拓展工具
拓展工具名字叫 AdGuard 下载地址: https://www.extfans.com/productivity/bgnkhhnnamicmpeenaelnjfhikgbkllg/download ...
- http://nian.so/#网站的拓展工具编写
这个网站叫做念我用了很久,有安卓和ios版本,我对网页版进行了处理: 写了此社交网站的一个拓展工具. 功能–:对自己或者他人的进展页面内容进行处理,可以筛选关键字.不需要可以隐藏.简单有效.其他页面无 ...
- Android Zip 解压与进度 实现,kotlin命令行输入值
String pathFileName = ""; while ((mZipEntry = zipInputStream.getNextEntry()) != null){ //获 ...
- Java ZipOutputStream 的使用,实现压缩文件
Java 压缩文件主要通过 ZipOutputStream 实现,ZipOutputStream 有 5 个关键的方法: putNextEntry() 向压缩包中添加子文件,并设置文件路径和名称(压缩 ...
- 关键词挖掘工具_关键词拓展工具集合
优化网站的关键词,首先要建立关键词库,那么要拓展和挖掘海量的关键词,我们除了手动去搜索引擎里搜索,收集下拉框.相关搜索,还有没有更丰富的关键词挖掘工具呢?那么,今天网睿seo公司的就会给大家分享下目前 ...
- php反序列化拓展攻击详解
2019-11-11 16:51 文章首发于先知社区:https://xz.aliyun.com/t/6699 前言 继上篇对thinkphp5版本反序列化pop链详细分析后,对tp的反序列化漏洞有了 ...
- 解决 Java ZipOutputStream 压缩的包winrar 无法正常解压
问题 使用ZipOutputStream生成的zip包,使用360解压可以正常解压,使用windors自带的解压工具会报错(压缩(zipped)文件夹xxx.zip无效). 原因 原因是winrar解 ...
最新文章
- gradle第二天(Building a RESTful Web Service)
- [原创] hadoop学习笔记:wordcout程序实践
- 生产环境JVM内存大小配置
- Nhibernate 基础关系映射
- 【转】hadoop深入研究:(十一)——序列化与Writable实现
- (转)64bit上安装32位oracle 10 g出现错误:无法定位承诺工序输入点 getprocessimagifilenamew 于动态链接库PSAPI.DLL...
- 计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...
- Object.prototype 原型和原型链
- IntelliJ IDEA 2020.1 瞬间定位文件夹、文件
- 利用XML文件的一个写日志的类!!!!!
- matlab界面语言修改
- pycharm中实现sin和cos函数曲线图
- VirtualBox 安装教程
- Comsol with Matlab
- 射频识别技术漫谈(4)——数据编码
- 自己的微信小程序学习笔记【1】——小程序开发工具的使用及项目文件说明
- 防火墙、DCD与TCP Keep alive
- (Scikit-Learn)线性回归 基函数的含义详解
- NDN网络学习笔记(一)——NDN基础
- P3258 [JLOI2014] 松鼠的新家 题解