Android基础操作-文件解压缩

文件操作是Android中经常遇到的问题,比如复制/删除, 最近会贡献一些平时开发中积累下来的工具类,希望能免去大家造轮子的体力活。 今天贡献一个解压缩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();
        }
    }
}

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-08-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?

ASP.NET MVC采用System.ComponentModel.DataAnnotations提供的元数据验证机制对Model实施验证,我们可以在Mode...

2085
来自专栏cmazxiaoma的架构师之路

通用Mapper和PageHelper插件 学习笔记

9753
来自专栏开发 & 算法杂谈

Intel Pin-JIT模式和Probe模式下库函数的替换

这篇文章主要介绍一下Intel Pin在JIT模式和Probe模式下对库换数的替换,以及实现中有哪写需要注意的地方。

2626
来自专栏编码小白

ofbiz实体引擎(九) 多租户

多租户在平台中是根据delegator不同操作不同的数据库 /** * @author 郑小康 * 设置完整的delegator 其可...

3394
来自专栏恰童鞋骚年

ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程

开篇:上一篇我们了解了在WebForm模式下一个Page页面的生命周期,它经历了初始化Init、加载Load以及呈现Render三个重要阶段,其中构造了页面控件...

1393
来自专栏salesforce零基础学习

salesforce 零基础学习(五十六)实现getById

本来想通过template封装DAO中的getById,结果template中无法选择$(object_name),所以此种想法打消了,直接封装成一个Helpe...

2265
来自专栏刘望舒

LeakCanary看这一篇文章就够了

LeakCanary是Square公司基于MAT开源的一个内存泄漏检测工具,在发生内存泄漏的时候LeakCanary会自动显示泄漏信息。

1.8K5
来自专栏后端沉思录

interface注入及报错分析

上面错误原因我想大家开发中都遇到过,大致错误原因是注入bean时,spring找到2个实例userServiceImplTest、userServiceImpl...

941
来自专栏闵开慧

struts2中action如何获取jsp页面参数

1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Reques...

38615
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第十二节 项目分层

3947

扫码关注云+社区

领取腾讯云代金券