posts - 22,comments - 35,trackbacks - 0

JDK API 中,定义了多种类型用于创建 ZIP 格式压缩文件的 API 。程序设计人员在开发网络应用程序时,可以基于这些 API ,编写将原始数据压缩成为 ZIP 格式的压缩数据,便于网络传输。那么, ZIP 压缩格式的定义形式是什么呢?

ZIP 压缩格式是在基于互联网进行数据传输过程中,被广泛采用的数据文件压缩格式。由于 ZIP 格式压缩文件可由多个压缩源文件构成,因此,在单个压缩文件内容的最后,是整个压缩文件的名称和定义目录结构的描述内容。在创建 ZIP 格式压缩文件过程中,其文件内容构成为:

[ 当前文件头+压缩数据+数据描述 ] . . .

[ 目录和文件结构 ]

ZIP 压缩格式的文件头描述字段和压缩数据描述内容字段的名称和占用字节数如下表所示:

1 ZIP 格式压缩文件文件头和压缩数据描述内容

文件头 压缩数据描述
字段名称 占用位数(字节)  字段名称 占用位数(字节)
文件头描述 4 文件头描述 4
版本类型 2 版本类型 2
通用位标志 2 通用位标志 2
压缩方法 2 压缩方法 2
最后修改文件时间 2 最后修改文件时间 2
最后修改文件数据 2 最后修改文件数据 2
CRC-32 4 CRC-32 4
压缩字节数 4 压缩字节数 4
未压缩字节数 4 未压缩字节数 4
文件名长度 2 文件名长度 2
附加字段长度 2 附加字段长度 2
文件名 可变长度 文件名 可变长度
附加文件名 可变长度 附加文件名 可变长度

PATH o:connecttype="rect" gradientshapeok="t" o:extrusionok="f" />SHAPE id=_x0000_i1025 style="WIDTH: 375pt; HEIGHT: 255pt" type="#_x0000_t75" alt="" />/SPAN>

ZIP 压缩文件中目录和文件结构描述内容如下表所示:

2 ZIP 格式压缩文件目录结构描述内容

文件构成信息描述 目录结构信息
字段名称 占用位数(字节) 字段名称 占用位数(字节)
文件头描述 4 目录结束标志 4
版本类型 2 磁盘号 2
可解压缩版本类型 2 目录开始位置的磁盘号 2
通用位描述 2 磁盘目录名称 2
压缩方法 2 目录结构 2
最后修改文件日期 2 目录字节数 4
最后修改文件数据 4 起始磁盘号 4
CRC-32 4 压缩文件描述长速度 2
压缩字节数 4 压缩文件描述 可变长度
未压缩字节数 2
文件名长度 2
附加字段长度 2
文件描述长度 2
起始磁盘号 2
内部文件属性 4
外部文件属性 4 附加文件名 可变
文件头起始位置 4 附加文件名 可变

/SPAN>

当然,在利用 JDK API 创建压缩数据文件时,不需要详细了解上述 ZIP 文件定义格式。但是, JDK 中定义的多种类型用于进行数据压缩和管理的对象,正是根据上述格式实现数据压缩和解压缩的。

2 JDK API ZIP 压缩格式支持对象

ZIP 压缩格式是在 Windows 操作系统环境中经常应用的压缩格式。 ZIP 压缩格式的压缩比高、压缩速度快,因而成为利用 Java 语言定义需要在网络中进行数据传输时,数据压缩格式的首选。

JDK API java.util.zip 包中,定义了多种类型用于创建和读取 zip 压缩格式文件的对象,常用对象的定义形式和主要成员方法如下:

●ZipEntry

由于可以将多个文件压缩到同一压缩文件中,因此, JDK API 中定义的 ZipEntry 对象用于标识 ZIP 压缩文件中每个原始文件的入口。该对象的定义结构为:

对象定义结构:

java.util.zip.ZipEntry

静态成员变量:

CENATT CENATX CENCRC … …

这些静态成员变量用于定义在压缩过程中采用的压缩算法。

构造方法:

ZipEntry(String name) 采用字符串类型参数 name 定义压缩文件中的原始文件入口对象实例。

ZipEntry(ZipEntry e) 采用 ZipEntry 对象类型参数 e 定义压缩文件中的原始文件入口对象实例。

成员方法:

long getCompressedSize() 获取压缩文件的大小

void setCompressedSize(long csize) 设置压缩文件的大小

int getMethod() 获取压缩时采用的压缩算法

void setMethod(int method) 设置压缩算法

long getSize() 获取压缩原始文件的大小

void setSize(long size) 设置压缩原始文件的大小

long getTime() 获取压缩文件入口标识的定义时间

void setTime(long time) 设置压缩文件入口标识的定义时间

boolean isDirectory() 判断该压缩入口标识是否代表目录

String getName() 返回压缩入口标识的名称

●ZipFile

该对象用于从 ZIP 压缩格式文件中读取压缩原始文件的入口。

对象定义结构:

java.util.zip.ZipFile

静态成员变量:

CENATT CENATX CENCRC … …

这些静态成员变量用于定义在压缩过程中采用的压缩算法。

构造方法:

ZipFile(File file) File 对象代表的压缩文件中读取压缩原始文件。

ZipFile(File file, int mode) File 对象代表的压缩文件中读取压缩原始文件,并且可以指定 ZIP 文件读取模式。

ZipFile(String name) 打开字符串参数 name 表示的 ZIP 压缩文件。

成员方法:

void close() 关闭被读取的 ZIP 压缩文件

Enumeration entries() 枚举出 ZIP 压缩文件中的各个压缩原始文件入口( Entry

ZipEntry getEntry(String name) 获取压缩文件中的各个压缩原始文件入口

InputStream getInputStream(ZipEntry entry) 通过 ZIP 压缩文件中的入口创建输入流对象

String getName() 获取 ZIP 压缩文件的名称

int size() 获取压缩文件中的入口数量

●ZipInputStream

该对象用于从 ZIP 压缩文件中创建输入流对象。

对象定义结构:

java.util.zip.ZipInputStream

静态成员变量:

CENATT CENATX CENCRC … …

这些静态成员变量用于定义在压缩过程中采用的压缩算法。

构造方法:

ZipInputStream(InputStream in) 应用输入流对象创建从 ZIP 文件中读取数据的输入流对象。

成员方法:

int available() 判断当前入口指定的压缩原始文件中是否还有未读数据。

void close() 关闭 ZIP 输入流对象

void closeEntry() 关闭被读取的 ZIP 入口,并移动到下一压缩原始文件入口。

protectedZipEntry createZipEntry(String name) 利用指定的名称创建 ZipEntry 对象实例。

ZipEntry getNextEntry() 将输入流对象移动到下一入口对象。

int read(byte[] b, int off, int len) 从当前 ZipEntry 中读取字节数组。

long skip(long n) 将输入流指定的读取数据位置移动 n 个字节。

●ZipOutputStream

该数据输出流对象用于创建 ZIP 压缩文件。

对象定义结构:

java.util.zip.ZipOutputStream

静态成员变量:

CENATT CENATX CENCRC … …

这些静态成员变量用于定义在压缩过程中采用的压缩算法。

构造方法:

ZipOutputStream(OutputStream out) 应用输出流对象实例创建 ZIP 格式输出流对象。

成员方法:

void close() 关闭 ZIP 输出流对象。

void closeEntry() 关闭当前 ZIP 输出流对象指定的 Entry ,并移动到下一 Entry

void putNextEntry(ZipEntry e) ZIP 压缩文件中创建新的压缩原始文件入口。

void setComment(String comment) 设置压缩文件的说明信息。

void setMethod(int method) 设置采用的压缩算法。

void write(byte[] b, int off, int len) 通过 ZIP 输出流对象向压缩文件中输出字节数组 b

posted on 2006-06-05 17:48 kelven 阅读(1752) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: