压缩程序的实现过程中,涉及到很多类的调用,除了压缩有关的类,还有IO类。对于IO类的调用不考虑的情况下,各个压缩功能类的调用流程(如图7):
(1)主程序gzip调用输出过滤流GZIPOutputStream,读取GZIP格式压缩数据,压缩开始。
(2)GZIPOutputStream调用CRC32来计算Checksum的数目。
(3)在CRC32返回结果后,GZIPOutputStream调用Deflater压缩类来进行压缩。在Deflater类的调用过程中,实现了对数据的压缩字符集确定与编码,也就是实现了LZ77算法、懒惰匹配与Huffman编码的结合。
(4)建立压缩文件,调用DeflaterOutputStream来压缩Deflater格式数据。
这些过程的操作是不能离开IO类的,所以实现这些过程的前提是要有数据流输入,也就是调用FileInputStream,打开需压缩文件作为文件输入流;在以上的流程完毕之后,调用FileOutputStream类建立压缩文件输出流,最终形成压缩后的文件。
4.1解压缩的程序流程
在解压缩的实现过程中,各个类的调用关系(如图8):
(1)主程序ungzip调用GZIPInputStream,读取GZIP格式压缩数据,解压缩开始。
(2)GZIPInputStream调用CRC32来计算Checksum的数目。
(3)在CRC32返回结果后,调用CheckedInputStream保存被读取数据的Checksum,同时调用Inflater进行解压缩。
(4)在Inflater解压缩过程中,如果数据格式错误,则调用DataFormatException;如果没有数据格式错误,则调用InflaterInputStream来解压Inflater格式的压缩数据。
4.1主函数代码
4.3.1gzip压缩模块代码
压缩模块要完成的就是将文件读入以后进行压缩,再将压缩后的数据写入一个新的文件,其部分代码如下:
publicclass gzip
{
publicstatic void main(String[] args)
{
if(args.length !=2)
{
System.out.println("Usage:javagzip ");
System.exit(1);
}
try
{
//打开需压缩文件作为文件输入流
FileInputStreamfin=new FileInputStream(args[0]);
//建立压缩文件输出流
FileOutputStreamfout=new FileOutputStream(args[1]);
//建立gzip压缩输出流
GZIPOutputStreamgzout=new GZIPOutputStream(fout);
byte[]buf=new byte[1024];//设定读入缓冲区尺寸
intnum;
while((num=fin.read(buf)) != -1)
{
gzout.write(buf,0,num);
}
gzout.close();//关闭流,必须关闭所有输入输出流.保证输入输出完整和释放系统资源.
fout.close();
fin.close();
}catch(IOExceptione)
{
System.out.println(e);
}
}
}
4.3.2ungzip解压缩模块代码
解压缩模块要完成的就是将文件读入以后进行解压缩,再将解压缩后的数据写入一个新的文件,其部分代码如下:
publicclass ungzip
{
publicstatic void main(String[] args)
{
if(args.length !=2)
{
System.out.println("Usage:javaungzip ");
System.exit(1);
}
try
{
//建立gzip压缩文件输入流
FileInputStreamfin=new FileInputStream(args[0]);
//建立gzip解压工作流
GZIPInputStreamgzin=new GZIPInputStream(fin);
//建立解压文件输出流
FileOutputStreamfout=new FileOutputStream(args[1]);
byte[]buf=new byte[1024];
intnum;
while((num=gzin.read(buf,0,buf.length)) != -1)
{
fout.write(buf,0,num);
}
gzin.close();
fout.close();
fin.close();
}catch(IOExceptione)
{
System.out.println(e);
}
}
}
4.2程序界面设计
为了让用户能便捷地进行压缩与解压缩的操作,还要对程序加入一个可视化界面。其外观如图9: