Zip文件结构

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

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

用到的类

ZipFile

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

ZipEntry

此类用于表示 ZIP 文件条目

ZipOutputStream

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

Enumeration

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

CheckedOutputStream

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

CRC32

可用于计算数据流的 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是目录还是文件,具体操作不再详解,可到文末的源码中查看。

END

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

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

Android下文件的压缩和解压(Zip格式)的更多相关文章

  1. linux下文件加密压缩和解压的方法

    一.用tar命令 对文件加密压缩和解压 压缩:tar -zcf  - filename |openssl des3 -salt -k password | dd of=filename.des3 此命 ...

  2. Linux下文件的压缩和解压

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  3. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  4. C#文件或文件夹压缩和解压

    C#文件或文件夹压缩和解压方法有很多,本文通过使用ICSharpCode.SharpZipLib.dll来进行压缩解压 1.新建一个winform项目,选择项目右键 管理NuGet程序包,搜索ICSh ...

  5. java 压缩和解压zip包

    网上有关压缩和解压zip包的博文一大堆,我随便找了一个.看了看,依照自己的须要改动了一下,与各位分享一下,希望各位大神指正: package com.wangpeng.utill; import ja ...

  6. java实现文件的压缩和解压

    java实现文件的压缩和解压 代码压缩实现 package com.hjh.demo.zip; import java.io.BufferedInputStream; import java.io.F ...

  7. [Swift通天遁地]七、数据与安全-(9)文件的压缩和解压

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. 用jdk1.6的pack200和unpack200,对jar文件进行压缩和解压 .pack.gz

    用jdk1.6的pack200和unpack200,对jar文件进行压缩和解压 解压xxx.jar.pack.gz为xxx.jar:unpack200 -r xxx.jar.pack.gz xxx.j ...

  9. gz文件的压缩和解压

    gz文件的压缩和解压 压缩: gzip filename 解压: gunzip filename.gz

随机推荐

  1. Codeforces 992 E. Nastya and King-Shamans

    \(>Codeforces\space992 E. Nastya and King-Shamans<\) 题目大意 : 给你一个长度为 \(n\) 的序列,有 \(q\) 次操作,每一次操 ...

  2. 【8.19校内测试】【背包】【卡特兰数】【数位dp】

    早上随便搞搞t1t3就开始划水了,t2一看就是组合数学看着肚子疼...结果t1t3都a了??感天动地. 从小到大排序,从前到后枚举i,表示i是整个背包中不选的物品中代价最小的那个,即i不选,1到i-1 ...

  3. VK Cup 2015 - Round 1 E. Rooks and Rectangles 线段树 定点修改,区间最小值

    E. Rooks and Rectangles Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemse ...

  4. codevs 1060 搞笑运动会 dp

    1060 搞笑世界杯 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codevs.cn/problem/1060/ Description ...

  5. Shell基础学习(四) echo命令

    1.显示普通的字符串 echo "boring" 2.显示转义字符 echo "\"It is a test!\""; 3.read 命令从 ...

  6. Linux下ip route、ip rule、iptables的关系(转)

    1.基础知识 1.1 路由 (Routing) 1.1.1 路由策略 (使用 ip rule 命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目 ...

  7. How to open a web site with the default web browser in a NEW window

    http://delphi.about.com/cs/adptips2004/a/bltip0504_4.htm When using ShellExecute (as explained in th ...

  8. Mosfet Bi-Directional Switch NMOS PMOS Back to Back

    http://www.electronic-products-design.com/geek-area/electronics/mosfets/using-mosfets-as-general-swi ...

  9. XmlnsDefinitionAttribute Is Pretty Nifty

    When we want to declaratively use our custom controls or reference the types we defined in XAML, we ...

  10. shell练习题

    一.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. 原文代码为:         Shell   1 2 3 4 5 6 7 8 9 10 #!/bin/bash ...