Android下文件的压缩和解压(Zip格式)
2017-08-21 本文已影响656人
卡咔喀
![](https://img.haomeiwen.com/i1849253/f72c7929817bdc59.png)
Zip文件结构
ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。
文件实体由一个头部和文件数据组,Central Directory由多个File header组成,每个File header都保存一个文件实体的偏移,文件最后由End of central directory结束。
![](https://img.haomeiwen.com/i1849253/fb60d3b254ee7208.png)
用到的类
ZipFile
此类用于从 ZIP 文件读取条目ZipEntry,在解压时用到
ZipEntry
此类用于表示 ZIP 文件条目
ZipOutputStream
此类为以 ZIP 文件格式写入文件实现输出流过滤器
Enumeration
实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素,在解压缩时会用到
CheckedOutputStream
需要维护写入数据校验和的输出流。校验和可用于验证输出数据的完整性。
CRC32
可用于计算数据流的 CRC-32 的类
压缩流程
首先要封装出一个ZipOutputStream:
![](https://img.haomeiwen.com/i1849253/5b3372c995d10cba.png)
ZipOutputStream zipOutputStream = new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(file),new CRC32()));
有了ZipOutputStream后,要压缩一个文件,就先在输出流加入一个ZipEntry,然后获取需要压缩的文件输入流,然后再输出:
![](https://img.haomeiwen.com/i1849253/be2feb030781e920.png)
注意最后要刷新和关闭输出流
zipOutputStream.flush();
zipOutputStream.close();
当然这只是单个文件的压缩,我们压缩文件时经常会压缩整个文件夹,所以还需要遍历整个文档,针对目录和文件分别作出判断:
![](https://img.haomeiwen.com/i1849253/884eb09995f51ec7.png)
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,获取其输入流,将其输出到指定位置:
![](https://img.haomeiwen.com/i1849253/e46a3f2829c1e24a.png)
这也是单个文件的解压缩,解压缩文件夹只需遍历ZipFile,判断ZipEntry是目录还是文件,具体操作不再详解,可到文末的源码中查看。
END
本文参考:
Android 解压zip文件你知道多少?