Android基础操作-文件解压缩

278 阅读4分钟
原文链接: mp.weixin.qq.com

文件操作是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();        }    }}

==== 今日沙雕 =====