Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3476164
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2007-03-09 18:50:57

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