)建立压缩文件,调用DeflaterOutputStream来压缩Deflater格式数据。
图7 压缩类的调用顺序图
这些过程的操作是不能离开IO类的,所以实现这些过程的前提是要有数据流输入,也就是调用FileInputStream,打开需压缩文件作为文件输入流;在以上的流程完毕之后,调用FileOutputStream类建立压缩文件输出流,最终形成压缩后的文件。
4.2 解压缩的程序流程
在解压缩的实现过程中,各个类的调用关系(如图8):
(1)主程序ungzip调用GZIPInputStream,读取GZIP格式压缩数据,解压缩开始。
(2)GZIPInputStream调用CRC32来计算Checksum的数目。
(3)在CRC32返回结果后,调用CheckedInputStream保存被读取数据的Checksum,同时调用Inflater进行解压缩。
(4)在Inflater解压缩过程中,如果数据格式错误,则调用DataFormatException;如果没有数据格式错误,则调用InflaterInputStream来解压Inflater格式的压缩数据。
图8 解压缩类的调用顺序图
4.3 主函数代码
4.3.1 gzip压缩模块代码
压缩模块要完成的就是将文件读入以后进行压缩,再将压缩后的数据写入一个新的文件,其部分代码如下:
public class gzip
{
public static void main(String[] args)
{
if (args.length !=2)
{
System.out.println("Usage:java gzip ");
System.exit(1);
}
try
{
//打开需压缩文件作为文件输入流
FileInputStream fin=new FileInputStream(args[0]);
//建立压缩文件输出流
FileOutputStream fout=new FileOutputStream(args[1]);
//建立gzip压缩输出流
GZIPOutputStream gzout=new GZIPOutputStream(fout);
byte[] buf=new byte[1024];//设定读入缓冲区尺寸
int num;
while ((num=fin.read(buf)) != -1)
{
gzout.write(buf,0,num);
}
gzout.close();//关闭流,必须关闭所有输入输出流.保证输入输出完整和释放系统资源.
fout.close();
fin.close();
}catch(IOException e)
{
System.out.println(e);
}
}
}
4.3.2 ungzip解压缩模块代码
解压缩模块要完成的就是将文件读入以后进行解压缩,再将解压缩后的数据写入一个新的文件,其部分代码如下:
public class ungzip
{
public static
上一篇:
数据结构(java)走迷宫
下一篇:
高陈基于Java超市账单管理系统