android开发分享I/O – 文件解压

在windows上经常做的就是文件的解压,那么有没有想过用io去做这件事呢,现在我们就利用io来解压一个文件。以下代码使用kotlin编写 val zipFile: ZipFile = ZipFile(“C:\Users\Lenovo\Downloads\xxx.zip”) val entries = zipFile.entries() while (entries.hasMoreElements()) { val nextElement = entries

在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文件中中文名称时,程序就会报错
I/O - 文件解压
当我运行程序时
I/O - 文件解压
中文名称的文件并没有打印出来

问题解决
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() 

效果如图
I/O - 文件解压
最后贴出完整的代码

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

(0)
上一篇 2021年10月22日
下一篇 2021年10月22日

精彩推荐