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

Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例。

Zip文件结构

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

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

zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩。

用到的类

Java
I/O类库还收录了一些能读写压缩格式流的类。要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了。这些类不是Reader和Writer,而是InputStream和OutStreamput的子类。这是因为压缩算法是针对byte而不是字符的。
相关类与接口:

ZipFile

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

Checksum 接口:被类Adler32和CRC32实现的接口
Adler32 :使用Alder32算法来计算Checksum数目
CRC32 :使用CRC32算法来计算Checksum数目

ZipEntry

此类用于表示 ZIP 文件条目

CheckedInputStream :InputStream派生类,可得到输入流的校验和Checksum,用于校验数据的完整性
CheckedOutputStream :OutputStream派生类,可得到输出流的校验和Checksum, 用于校验数据的完整性

ZipOutputStream

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

DeflaterOutputStream :压缩类的基类。
ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。
GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格式

Enumeration

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

InflaterInputStream :解压缩类的基类
ZipInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据
GZIPInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据

CheckedOutputStream

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

ZipEntry 类:表示 ZIP 文件条目
ZipFile 类:此类用于从 ZIP 文件读取条目

CRC32

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

使用ZIP对多个文件进行压缩与解压

压缩流程

首先要封装出一个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());
            }
}

Java对Zip格式类库支持得比较全面,得用它可以把多个文件压缩成一个压缩包。这个类库使用的是标准Zip格式,所以能与很多的压缩工具兼容。

解压缩流程

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

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