java zipfile用法_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压缩文件的使用

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

wH5PBx4PIwUXgAAAABJRU5ErkJggg==

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

// 压缩文件

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();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

// 解压缩文件

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();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

控制台打印: Hello World.

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

ZIP压缩文件的使用

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

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());

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

// 解压缩文件

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();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

// 解压缩文件

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();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

nvfpXGwPAe69s7zXimxdNM0L+qkzL0uDqbMd4arW+LT+vxP8EQD+AYJBr5BgoFvkGDgGyQY+AYJBr75A9cSSOlBmVO2AAAAAElFTkSuQmCC

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

N8+QAAAABJRU5ErkJggg==

GZIP与ZIP压缩的比较

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

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

友情链接

测试项目源代码下载 访问密码 56c3

http://www.cnblogs.com/huhx/p/javaCompress.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现压缩与解压缩ZIP   import java.io.BufferedInputStream;   import java.io.BufferedOutputStream;   import java.io.File;   import java.io.FileInputStream;   import java.io.FileOutputStream;   import java.util.zip.ZipEntry;   import java.util.zip.ZipOutputStream;   public class Zip {   static final int BUFFER = 2048;   public static void main(String argv[]) {   try {   BufferedInputStream origin = null;   FileOutputStream dest = new FileOutputStream("E:\\test\\myfiles.zip");   ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(   dest));   byte data[] = new byte[BUFFER];   File f = new File("e:\\test\\a\\");   File files[] = f.listFiles();   for (int i = 0; i < files.length; i++) {   FileInputStream fi = new FileInputStream(files[i]);   origin = new BufferedInputStream(fi, BUFFER);   ZipEntry entry = new ZipEntry(files[i].getName());   out.putNextEntry(entry);   int count;   while ((count = origin.read(data, 0, BUFFER)) != -1) {   out.write(data, 0, count);   }   origin.close();   }   out.close();   } catch (Exception e) {   e.printStackTrace();   }   }   }   解压缩的   import java.io.BufferedInputStream;   import java.io.BufferedOutputStream;   import java.io.File;   import java.io.FileOutputStream;   import java.util.Enumeration;   import java.util.zip.ZipEntry;   import java.util.zip.ZipFile;   public class UnZip {   static final int BUFFER = 2048;   public static void main(String argv[]) {   try {   String fileName = "E:\\test\\myfiles.zip";   String filePath = "E:\\test\\";   ZipFile zipFile = new ZipFile(fileName);   Enumeration emu = zipFile.entries();   int i=0;   while(emu.hasMoreElements()){   ZipEntry entry = (ZipEntry)emu.nextElement();   //会把目录作为一个file读出一次,所以只建立目录就可以,之下的文件还会被迭代到。   if (entry.isDirectory())   {   new File(filePath + entry.getName()).mkdirs();   continue;   }   BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值