Android下文件的压缩和解压(Zip格式)

Android下文件的压缩和解压(Zip格式)_第1张图片

Zip文件结构

ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。

文件实体由一个头部和文件数据组,Central Directory由多个File header组成,每个File header都保存一个文件实体的偏移,文件最后由End of central directory结束。

Android下文件的压缩和解压(Zip格式)_第2张图片

用到的类

ZipFile

此类用于从 ZIP 文件读取条目ZipEntry,在解压时用到

ZipEntry

此类用于表示 ZIP 文件条目

ZipOutputStream

此类为以 ZIP 文件格式写入文件实现输出流过滤器

Enumeration

实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素,在解压缩时会用到

CheckedOutputStream

需要维护写入数据校验和的输出流。校验和可用于验证输出数据的完整性。

CRC32

可用于计算数据流的 CRC-32 的类

压缩流程

首先要封装出一个ZipOutputStream:


Android下文件的压缩和解压(Zip格式)_第3张图片
ZipOutputStream zipOutputStream = new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(file),new CRC32()));

有了ZipOutputStream后,要压缩一个文件,就先在输出流加入一个ZipEntry,然后获取需要压缩的文件输入流,然后再输出:

Android下文件的压缩和解压(Zip格式)_第4张图片

注意最后要刷新和关闭输出流

zipOutputStream.flush();
zipOutputStream.close();

当然这只是单个文件的压缩,我们压缩文件时经常会压缩整个文件夹,所以还需要遍历整个文档,针对目录和文件分别作出判断:

Android下文件的压缩和解压(Zip格式)_第5张图片
if (fileSrc.isDirectory()) {
            File[] files = fileSrc.listFiles();

            name = name+"/";
            zipOutputStream.putNextEntry(new ZipEntry(name));  // 建一个文件夹
            System.out.println("目录名: "+name);

            for (File f : files) {
                zip(zipOutputStream,name+f.getName(),f);
                System.out.println("目录: "+name+f.getName());
            }
}

解压缩流程

解压缩就是压缩的逆过程,其过程就是从压缩文件中获取ZipEntry,获取其输入流,将其输出到指定位置:

Android下文件的压缩和解压(Zip格式)_第6张图片

这也是单个文件的解压缩,解压缩文件夹只需遍历ZipFile,判断ZipEntry是目录还是文件,具体操作不再详解,可到文末的源码中查看。

END

本文参考:
Android 解压zip文件你知道多少?

源码:
https://github.com/xiaoniu/AndroidZipFile

你可能感兴趣的:(Android下文件的压缩和解压(Zip格式))