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