疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java基础Zip压缩的使用


 

   

  java中提供了对压缩格式的数据流的读写。它们封装到现成的IO 类中,以提供压缩功能。下面我们开始java中压缩文件的使用。

  目录导航:

  关于压缩的简要说明

  一、 Java中有着压缩的类:

  CheckedInputStream GetCheckSum为任何InputStream 产生校验和(不仅是解压)

  CheckedOutputStream GetCheckSum为任何OutputStream 产生校验和(不仅是解压)

  DeflaterOutputStream 用于压缩类的基础类

  ZipOutputStream 一个DeflaterOutputStream,将数据压缩成Zip 文件格式

  GZIPOutputStream 一个DeflaterOutputStream,将数据压缩成GZIP 文件格式

  InflaterInputStream 用于解压类的基础类

  ZipInputStream 一个DeflaterInputStream,解压用Zip 文件格式保存的数据

  GZIPInputStream 一个DeflaterInputStream,解压用GZIP 文件格式保存的数据

  二、 压缩库的一些说明:

  压缩类库是按字节方式而不是字符方式处理的,它们属于InputStream和OutputStream继承层次结构的一部分

  三、 ZIP压缩的使用注意:

  对于要加入压缩档的每一个文件,都必须调用putNextEntry,并将其传递给一个ZipEntry 对象。

  ZipEntry 对象包含了一个功能全面的接口,利用它可以获取和设置Zip 文件内那个特定的Entry(入口)上能够接受的所有数据:名字、压缩后和压缩前的长度、日期、CRC 校验和、额外字段的数据、注释、压缩方法以及它是否一个目录入口等等。

  尽管CheckedInputStream 和CheckedOutputStream 同时提供了对Adler32 和CRC32 校验和的支持,但是ZipEntry 只支持CRC 的接口

  为解压文件,ZipInputStream 提供了一个getNextEntry方法,能在有的前提下返回下一个ZipEntry

  可以用ZipFile 对象读取文件。该对象有一个entries方法,可以为ZipEntry 返回一个Enumeration(枚举)。

  GZIP压缩文件的使用

  我们通过一个简单的程序用例来展开今天压缩类的使用讲解 ,程序结构如下

  一、 我们创建一个GzipCompress类,用于GZIP压缩类的测试:首先是压缩文件方法compress:

  // 压缩文件

  private static void compress throws Exception {

  BufferedReader in = new BufferedReader(new FileReader(("compress/test.txt")));

  BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("uncompress/test.gz")));

  int c;

  while ((c = in.read) != -1) {

  out.write(c);

  }

  in.close;

  out.close;

  }

  二、 我们创建GZIP的解压缩方法:uncompress

  // 解压缩文件

  private static void uncompress throws Exception {

  BufferedReader in = new BufferedReader(

  new InputStreamReader(new GZIPInputStream(new FileInputStream("uncompress/test.gz"))));

  String str;

  while ((str = in.readLine) != null) {

  System.out.println(str);

  }

  in.close;

  }

  三、 在Main方法运行,得到如下结果:

  控制台打印: Hello World.

  在uncompress文件夹下生成test.gz文件

  ZIP压缩文件的使用

  一、 我们创建一个ZipCompress类,用于GZIP压缩类的测试:首先是压缩文件方法compress:压缩huhx.png,test2.txt, test3.txt, test4.txt文件

  private final static String resources = new String { "huhx.png", "test2.txt", "test3.txt", "test4.txt" };

  // 压缩文件

  private static void compress throws Exception {

  FileOutputStream f = new FileOutputStream("uncompress/test.zip");

  CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32);

  ZipOutputStream zos = new ZipOutputStream(csum);

  BufferedOutputStream out = new BufferedOutputStream(zos);

  zos.setComment("A test of java zipping");

  ZipEntry entry = null;

  for (String resource : resources) {

  System.out.println("writing file: " + resource);

  BufferedReader in = new BufferedReader(new FileReader("compress/" + resource));

  entry = new ZipEntry(resource);

  entry.setComment(resource + " comments");

  zos.putNextEntry(entry);

  int c;

  while ((c = in.read) != -1) {

  out.write(c);

  }

  in.close;

  out.flush;

  }

  out.close;

  System.out.println("checksum: " + csum.getChecksum.getValue);

  }

  二、 我们创建ZIP的解压缩方法:uncompress1

  // 解压缩文件

  private static void uncompress1 throws Exception {

  FileInputStream fi = new FileInputStream("uncompress/test.zip");

  CheckedInputStream csum = new CheckedInputStream(fi, new Adler32);

  ZipInputStream in2 = new ZipInputStream(csum);

  BufferedInputStream bis = new BufferedInputStream(in2);

  ZipEntry ze;

  while ((ze = in2.getNextEntry) != null) {

  System.out.println("reading file: " + ze.getName);

  }

  System.out.println("checksum: " + csum.getChecksum.getValue);

  bis.close;

  }

  三、我们创建ZIP的解压缩另外一种方法:uncompress2

  // 解压缩文件

  private static void uncompress2 throws Exception {

  ZipFile zf = new ZipFile("uncompress/test.zip");

  Enumeration e = zf.entries;

  while (e.hasMoreElements) {

  ZipEntry entry = (ZipEntry) e.nextElement;

  System.out.println("File: " + entry.getComment);

  }

  zf.close;

  }

  四、 运行compress和uncompress1方法,得到结果如下:

  五、运行compress和uncompress2方法,得到结果如下:

  GZIP与ZIP压缩的比较

  GZIP: 如果只有单个数据流需要压缩(而不是一系列不同的数据),那么它就可能是最适当选择。

  ZIP: 它可以方便地保存多个文件。甚至有一个独立的类来简化对Zip 文件的读操作