美文网首页Android开发经验谈
带你走进Android之基础篇--文件解压缩

带你走进Android之基础篇--文件解压缩

作者: 奶盖ww | 来源:发表于2019-06-25 21:32 被阅读2次

    嗨,你终于来啦~
    等你好久啦~
    从今天开始每天分享一篇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();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:带你走进Android之基础篇--文件解压缩

        本文链接:https://www.haomeiwen.com/subject/rmxfcctx.html