Java用ZIP进行多文件压缩保存

       支持ZIP格式的Java库更加全面。利用该库可以方便地保存多个文件,他甚至有一个独立的类,是的读取ZIP文件更加方便。这个类库使用的是标准ZIP格式,所以能与当前那些可通过因特网下载的压缩工具很好的协作。使用zip保存,需要使用Checksum类来计算和校验文件的校验和的方法。一共有两种Checksum类型:Adler32(它快一些)和CRC32(慢一些,但更准确)。

package java186;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.Enumeration;
import java.util.zip.Adler32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipCompress {

	public static void main(String[] args) throws Exception{
		args = new String[3];
    	args[0] = "d:/file/data.txt";
    	args[1] = "d:/file/DirList.java";
    	args[2] = "test.txt";
		
		FileOutputStream f = new FileOutputStream("d:/file/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");
		for(String arg : args){
			System.out.println("writing file: "+arg);
			BufferedReader in = new BufferedReader(new FileReader(arg));
			zos.putNextEntry(new ZipEntry(arg));
			int c;
			while((c=in.read())!=-1){
				out.write(c);
			}
			in.close();
			out.flush();
		}
		out.close();
		System.out.println("CheckSum: "+csum.getChecksum().getValue());
		System.out.println("Reading file");
		FileInputStream fi = new FileInputStream("d:/file/test.zip");
		CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32());
		ZipInputStream in2 = new ZipInputStream(csumi);
		BufferedInputStream bis = new BufferedInputStream(in2);
		ZipEntry ze;
		while((ze=in2.getNextEntry())!=null){
			System.out.println("Reading file "+ze);
			int x;
			while((x=bis.read())!=-1){
				System.out.write(x);
			}
		}
		if(args.length==1)System.out.println("Checksum: "+csumi.getChecksum().getValue());
		bis.close();
		
		ZipFile zf = new ZipFile("d:/file/test.zip");
		Enumeration e = zf.entries();
		while(e.hasMoreElements()){
			ZipEntry ze2 = (ZipEntry) e.nextElement();
			System.out.println("File: "+ze2);
		}
	}
}


        对每一个要加入压缩档案的文件,都必须调用putNextEntry(),并将其传递给一个ZipEntry对象。ZipEntry对象包含了一个功能广泛的接口,允许你获取和设置Zip文件内该特定项所有可利用的数据:名字、压缩的和未压缩的文件大小、日期、CRC校验和等等。然而,尽管Zip格式提供了设置密码的方法,当Java的Zip类库并不提供这方面的支持。虽然CheckedInputStream和CheckedOutputStream都支持Adler32和CRC32两种类型的校验和,但是ZipEntry类只有一个支持CRC的接口。虽然这是一个底层Zip格式的限制,但却限制了人们不能使用速度更快的Adler32.


       为了能够解压缩文件,ZipInputStream提供了一个getNextEntry()方法返回下一个ZipEntry(如果存在的话)。解压缩文件有一个更简便的方法-------利用ZipFile对象读取文件。该对象有个entries()方法用来向ZipEntries返回一个Enumeration(枚举)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java调用Zip类批量压缩多个文件,此前有一个是压缩单个文件,也可参考,相关代码中可找到此源码。   public class ZipDemo extends JFrame{   JFileChooser fileChooser; //文件选择器   JList fileList; //待压缩文件列表   Vector files; //文件数据(待压缩文件)   JButton jbAdd; //增加文件按钮   JButton jbDelete; //删除文件按钮   JButton jbZip; //压缩按钮   JTextField target; //目标文件文本域   public ZipDemo(){   super("用ZIP压缩多个文件"); //调用父类构造函数   fileChooser=new JFileChooser(); //实例化文件选择器   files=new Vector(); //实例化文件数据Vector   fileList=new JList(files); //实例化已选择文件列表   jbAdd=new JButton("增加"); //实例化按钮组件   jbDelete=new JButton("删除");   jbZip=new JButton("压缩");   target=new JTextField(18);   JPanel panel=new JPanel(); //实例化面板,用于容纳按钮   panel.add(jbAdd); //增加组件到面板上   panel.add(jbDelete);   panel.add(jbZip);   JPanel panel2=new JPanel();   panel2.add(new JLabel("目标文件"));   panel2.add(target);   JScrollPane jsp=new JScrollPane(fileList);   Container container=getContentPane(); //得到容器   container.add(panel2,BorderLayout.NORTH); //增加组件到容器   container.add(jsp,BorderLayout.CENTER);   container.add(panel,BorderLayout.SOUTH);   jsp.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); //设置边界
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值