GZIP压缩格式简介
在JDK API中同样定义了多种类型用于创建和解除GZIP压缩格式数据文件的通用对象和方法用于基于JDK编写GZIP压缩数据管理程序
GZIP压缩格式是在Sun Solaris操作系统中广泛采用的压缩数据格式由于在数据压缩过程中可以采用多种类型的压缩算法因此压缩文件的压缩比很高另外在创建的压缩文件中定义了用于表述时间和文件属主的时戳(Time Stamp)可以使文件方便地在网络中传输和交换
GZIP压缩数据文件由一系列的数字构成而各数字对应如下描述压缩文件信息的字段
ID缺省值用于标识GZIP压缩格式
ID缺省值用于标识GZIP压缩格式
CM采用的压缩方法其值为~是保留值标识采用deflate压缩方法
FLG用于标识各占用位的标志
MTIME记录了最近修改时间
XFL用于标识采用压缩算法的选项
OS定义了操作系统类型
XLEN定义了附加信息段的长度
COMM压缩文件说明信息
CRC记录了CRC算法采用的循环冗余校验值
上述信息完整描述了GZIP压缩格式数据当然基于JDK开发的压缩数据管理程序不需要明确知道上述压缩数据定义格式只需要创建相应的管理对象并调用这些对象中定义的方法即可
JDK API中ZIP压缩格式支持对象
GZIP压缩格式是在JDK API中定义支持的另外一种数据压缩格式由上面介绍的GZIP格式数据压缩方法可知GZIP压缩格式具有更大的压缩比因此在Unix操作系统中这种类型的数据压缩形式的应用十分普及
与JDK API对ZIP压缩格式的支持不同在JDK API中只定义了GZIPInputStream和GZIPOutputStream两种类型的流(Stream)对象用于在基于流的数据传输过程中实现数据压缩这两个对象的继承定义结构如下所示
javalangObject
|
+javaioInputStream
|
+javaioFilterInputStream
|
+javautilzipInflaterInputStream
|
+javautilzipGZIPInputStream(javautilzipGZIPOutputStream)
以采用GZIP格式进行数据输入处理GZIPInputStream对象为例由上述对象的继承定义结构可以看出该对象继承了InflaterInputStream流对象需要说明的是在ZIP压缩包中定义了Inflater和Deflater两个对象用于基于ZLIB压缩库实现多种格式的数据压缩和解压缩因此InflaterInputStream流对象的作用是采用ZLIB库作为数据压缩管理的引擎而GZIPInputStream对象则进一步将流的数据加工进行细化用于读取GZIP格式的压缩数据同理GZIPOutputStream对象用于创建GZIP格式的压缩数据文件下面将对两个对象的定义内容进行说明
●GZIPInputStream
对象定义结构
javautilzipGZIPInputStream
静态成员变量
protected CRC crc用于说明采用的数据压缩算法为CRC
protected boolean eos说明输入流对象结束读取输入数据
构造方法
GZIPInputStream(InputStream in)采用默认的缓沖区字节数创建输入流对象
GZIPInputStream(InputStream in int size)创建由整数类型变量size指定缓沖区字节数的输入流对象
成员方法
该对象只定义了如下两个成员方法
void close()关闭输入流对象
int read(byte[] buf int off int len)读取输入流的数据到buf字节数组中
●GZIPOutputStream
对象定义结构
javautilzipGZIPOutputStream
静态成员变量
protected CRC crc用于说明采用的数据压缩算法为CRC
构造方法
GZIPOutputStream(OutputStream out)采用默认的缓沖区字节数创建输出流对象
GZIPOutputStream(OutputStream out int size)创建由整数类型变量size指定缓沖区字节数的输出流对象
成员方法
void close()关闭输出流对象
void finish()结束数据输出但不关闭输出流对象
void write(byte[] buf int off int len)将字节数组buf中的内容压缩输出到输出流对象中
创建GZIP压缩格式文件实例
经过前面对JDK API中创建GZIP压缩格式文件的相关对象的结构成员方法定义形式的说明读者一定会问如何应用这些对象和对象中定义的成员方法呢?请读者看下面的实例代码
//ZipDemojava
import javaio*;
import javautilzip*;
public class GZIPDemo
{
public static void main(String[] args)
{
if (argslength !=)
{
Systemoutprintln("Usage:java GZIPDemo SourceFile DestnFile" + argslength);
Systemexit();
}
try
{
int number;
//打开需压缩文件作为文件输入流
FileInputStream fin = new FileInputStream(args[]);
//建立压缩文件输出流
FileOutputStream fout=new FileOutputStream(args[]);
//建立GZIP压缩输出流
GZIPOutputStream gzout=new GZIPOutputStream(fout);
//设定读入缓沖区尺寸
byte[] buf=new byte[];
while ((number = finread(buf)) != )
gzoutwrite(bufnumber);
gzoutclose();
foutclose();
finclose();
}
catch(IOException e)
{
Systemoutprintln(e);
}
}
}
上面的程序用于将命令行中指定的文件SourceFile进行压缩创建GZIP格式的压缩文件DestnFile
在该程序的实现代码中首先创建用于进行文件输入和输出的FileInputStream和FileOutputStream对象并以FileOutputStream对象实例为参数创建GZIPOutputStream对象实例从而为创建GZIP格式压缩文件建立数据流基础
在随后的代码中利用FileInputStream对象中定义的read方法从源文件中读取待压缩文件的内容同时利用GZIPOutputStream对象中定义的write方法将压缩后的数据写出到输出文件中从而实现数据文件的GZIP格式压缩处理
在Java中创建GZIP格式压缩文件的方法很简单并且利用WinZipWinRAR等类型的压缩管理软件均能够打开创建的GZIP格式的压缩文件那么如何利用JDK API中定义的对象将被压缩的文件解压缩呢?请读者看下一节的内容
GZIP格式文件解压缩实例
下面的程序用于将利用JDK API中定义对象的成员方法将GZIP格式压缩文件进行解压缩从而恢复压缩原始文件
//UnGZIPDemojava
import javaio*;
import javautilzip*;
public class UnGZIPDemo
{
public static void main(String[] args)
{
if (argslength !=)
{
Systemoutprintln("Usage:java UnGZIPDemo GZIPFile DestnFile");
Systemexit();
}
try
{
int number;
//建立GZIP压缩文件输入流
FileInputStream fin=new FileInputStream(args[]);
//建立GZIP解压工作流
GZIPInputStream gzin=new GZIPInputStream(fin);
//建立解压文件输出流
FileOutputStream fout=new FileOutputStream(args[]);
//设定读入缓沖区尺寸
byte[] buf=new byte[];
while ((nnumber=gzinread(bufbuflength)) != )
foutwrite(bufnnumber);
gzinclose();
foutclose();
finclose();
}
catch(IOException e)
{
Systemoutprintln(e);
}
}
}
在GZIP格式压缩文件解压缩程序代码中仍然首先创建FileInputStream和FileOutputStream对象并基于创建的FileInputStream对象创建GZIPInputStream对象在随后的代码中调用GZIPInputStream对象中定义的read方法在从压缩文件中读取数据内容并进行解压缩处理后将解除压缩后的数据内容利用文件输出流对象进行输出从而实现数据文件的解压缩处理
小