欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

I/O - 文件解压

程序员文章站 2022-06-15 12:47:14
在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确实很好用,建议大家去学习

本文地址:https://blog.csdn.net/qq_36658826/article/details/107182486