android 解压zip报错_带你走进Android之基础篇--文件解压缩

本文介绍如何在Android中解压zip文件,包括关键类`ZipFile`、`ZipInputStream`、`FileOutputStream`的使用,以及解压缩的具体流程。提供了一个完整的解压缩工具类代码示例。
摘要由CSDN通过智能技术生成

e87d75ff2bb34a14a46e57b43fa4c6b0.png

嗨,你终于来啦~
等你好久啦~
从今天开始每天分享一篇Android需要了解的知识点,喜欢的小伙伴欢迎关注,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。


最近会贡献一些平时开发中积累下来的工具类,希望能免去大家造轮子的体力活。
今天贡献一个解压缩zip文件的工具。

关键类

可以归纳起来所有跟文件操作相关的流程都要下面这几个类

  • File
  • InputStream
  • OutputStream
    解压缩也一样,用于解压缩的工具类是这三个,
  • ZipFile
  • ZipInputStream
  • FileOutputStream

解压缩流程

首先实例化ZipFile对象,
通过InputStream读取流,ZipInputStream提供了一个方法

  • getNextEntry()

返回一个 ZipEntry对象。这个对象所表示的意义是压缩/解压的文件信息,可以是文件夹,也可以是文件。
所以在获取ZipEntry的之后,如果用 getName()拿它的文件名的话,
会以路径+文件名的形式呈现。
比方我们现在有压缩文件 test.zip,
源文件 test/ 下面存在这么个层级结构:

test/a/b/c/file.txt

那么在解压缩的时候,我们拿到的file.txt的 ZipEntry的 name会是下面这样:

a/b/c/file.txt

ZipEntry 的获取是在循环里不断迭代的,
而我们所获取到的 ZipEntry不仅会包括 file.txt文件,
同时也包括 a、b、c三个文件夹,
这也是为什么下面给出的工具类里会有这段代码的原因。

String fileName = zipEntry.getName();
if(fileName != null && fileName.contains(MAC_IGNORE)) {
    continue;
}
File temp = new File(targetPath + File.separator + fileName);
if(zipEntry.isDirectory()) {
    File dir = new File(targetPath + File.separator + fileName);
    dir.mkdirs();
    continue;
}
if (temp.getParentFile() != null && !temp.getParentFile().exists()) {
    temp.getParentFile().mkdirs();
}

完整代码

解压缩的思路在上面已经描述了,下面给出完整代码:

public class UnzipUtil {

    //过滤在mac上压缩时自动生成的__MACOSX文件夹
    private static final String MAC_IGNORE = "__MACOSX/";

    public static void decompressFile(String target, String source) {
        if(TextUtils.isEmpty(target)){
            return;
        }
        try {
            File file = new File(source);
            if(!file.exists()) {
                return;
            }
            ZipFile zipFile = new ZipFile(file);
            ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));
            ZipEntry zipEntry = null;
            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
                String fileName = zipEntry.getName();
                if(fileName != null && fileName.contains(MAC_IGNORE)) {
                    continue;
                }
                File temp = new File(target + File.separator + fileName);
                if(zipEntry.isDirectory()) {
                    File dir = new File(target + File.separator + fileName);
                    dir.mkdirs();
                    continue;
                }
                if (temp.getParentFile() != null && !temp.getParentFile().exists()) {
                    temp.getParentFile().mkdirs();
                }
                byte[] buffer = new byte[1024];
                OutputStream os = new FileOutputStream(temp);
                // 通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流
                InputStream is = zipFile.getInputStream(zipEntry);
                int len = 0;
                while ((len = is.read(buffer)) != -1) {
                    os.write(buffer, 0, len);
                }
                os.close();
                is.close();
            }
            zipInputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

END


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值