在windows上经常做的就是文件的解压,那么有没有想过用io去做这件事呢,现在我们就利用io来解压一个文件。
以下代码使用kotlin编写
val zipFile: ZipFile = ZipFile("C:\Users\Lenovo\Downloads\xxx.zip") val entries = zipFile.entries() while (entries.hasMoreElements()) { val nextElement = entries.nextElement() val name = nextElement.name println(name) }
细心的朋友可能会发现,当我的zip文件中中文名称时,程序就会报错
当我运行程序时
中文名称的文件并没有打印出来
问题解决
1、最简单办法当然是手动修改文件的名称,但是这样就没有意义了
2、使用基于Ant的Zip压缩工具类 (在这里代码就不贴了)
接下来我们来获取解压的文件
创建不同层级的文件夹
var filePath = "D:\android\project\Aes\lib3\src\main\java\file" val file = File(File(filePath), name) if (!file.parentFile.exists()) file.parentFile.mkdirs()
执行这段代码我的电脑上将会创建出一个file的文件夹
接下来我们需要定义一个output Steam来写入我们的文件
val fos = FileOutputStream(file)
获取zip中的输出流
val `is` = zipFile.getInputStream(nextElement)
将文件写入file中
var byteArray = ByteArray(1024) while ( `is`.read(byteArray)!=-1) { fos.write(byteArray) }
最后,关闭我们的流,不关闭一定会造成内存泄漏
`is`.close() fos.close() zipFile.close()
效果如图
最后贴出完整的代码
fun main() { val zipFile: ZipFile = ZipFile("C:\Users\Lenovo\Downloads\xxx.zip") val entries = zipFile.entries() while (entries.hasMoreElements()) { val nextElement = entries.nextElement() val name = nextElement.name println(name) //设置文件解压的目标位置 var filePath = "D:\android\project\Aes\lib3\src\main\java\file" val file = File(File(filePath), name) if (!file.parentFile.exists()) file.parentFile.mkdirs() //定义一个输出流 val fos = FileOutputStream(file) //获取到输入流 val `is` = zipFile.getInputStream(nextElement) var byteArray = ByteArray(1024) while ( `is`.read(byteArray)!=-1) { fos.write(byteArray) } //关闭流 `is`.close() fos.close() } //关闭流 zipFile.close() }
写到这里,后来在运行时发现了问题,zip存在文件夹时是检查不到文件的,所以现在进行修改
fun main() { //需要解压的文件 val zipFile = ZipFile("C:\Users\Lenovo\Desktop\test.zip") //解压的目录 var filePath = "C:\Users\Lenovo\Desktop\file" //如果该目录不存在需要先创建 val file = File(filePath) if (!file.exists()) file.mkdirs() //获取到zip包中的文件集合 val entries = zipFile.entries() //遍历取出 while (entries.hasMoreElements()) { val nextElement = entries.nextElement() val name = nextElement.name println(name) if (!nextElement.isDirectory) { //设置文件解压的目标位置 val file = File(file, name) if (!file.parentFile.exists()) file.parentFile.mkdirs() //定义一个输出流 val fos = FileOutputStream(file) //获取到输入流 val `is` = zipFile.getInputStream(nextElement) var byteArray = ByteArray(1024) while (`is`.read(byteArray) != -1) { fos.write(byteArray) } `is`.close() fos.close() } } zipFile.close() } //只能解压.zip文件格式 //只能解压.zip文件格式 //只能解压.zip文件格式
kotlin确实很好用,建议大家去学习
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/addevelopment/897340.html