[java][io][ZIP]用ZIP保存多个文件

Java对Zip格式类库支持得比较全面,得用它可以把多个文件压缩成一个压缩包。这个类库使用的是标准Zip格式,所以能与很多的压缩工具兼容。

ZipOutputStream类有设置压缩方法以及在压缩方式下使用的压缩级别,zipOutputStream.setMethod(int method)设置用于条目的默认压缩方法。只要没有为单个 ZIP 文件条目指定压缩方法,就使用ZipOutputStream所设置的压缩方法来存储,默认值为 ZipOutputStream.DEFLATED(表示进行压缩存储),还可以设置成STORED(表示仅打包归档存储)。ZipOutputStream在设置了压缩方法为DEFLATED后,我们还可以进一步使用setLevel(int level)方法来设置压缩级别,压缩级别值为0-9共10个级别(值越大,表示压缩越利害),默认为Deflater.DEFAULT_COMPRESSION=-1。当然我们也可以通过条目ZipEntry的setMethod方法为单个条件设置压缩方法。

类ZipEntry描述了存储在ZIP文件中的压缩文件。类中包含有多种方法可以用来设置和获得ZIP条目的信息。类ZipEntry是被ZipFile[zipFile.getInputStream(ZipEntry entry)]和ZipInputStream使用来读取ZIP文件,ZipOutputStream来写入ZIP文件的。有以下这些有用的方法:getName()返回条目名称、isDirectory()如果为目录条目,则返回 true(目录条目定义为其名称以 '/' 结尾的条目)、setMethod(int method) 设置条目的压缩方法,可以为 ZipOutputStream.STORED 或 ZipOutputStream .DEFLATED。


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;
/**
 * 
 * 用Zip保存多个文件.
 *
 */
public class ZipCompress {

	private static final String FILE = "d:\\test.zip";
	
	public static void main(String[] args) throws Exception {
		//建立一个文件输出流
		FileOutputStream file = new FileOutputStream(FILE);
		//建立一个CheckSum输出流,Adler32 CheckSum类型校验和
		CheckedOutputStream csum = new CheckedOutputStream(file, new Adler32());
		//zip输出流
		ZipOutputStream zos = new ZipOutputStream(csum);
		//使用缓冲输出流包装,提升性能
		BufferedOutputStream out = new BufferedOutputStream(zos);
		//注释
		zos.setComment("A test of Java Zipping");
		for(String s : args){
			System.out.println("Writing file " + s);
			//读文件
			BufferedReader in = new BufferedReader(new FileReader(s));
			
			zos.putNextEntry(new ZipEntry(s));
			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 in = new FileInputStream(FILE);
		CheckedInputStream csumi = new CheckedInputStream(in, new Adler32());
		ZipInputStream zin = new ZipInputStream(csumi);
		BufferedInputStream bis = new BufferedInputStream(zin);
		ZipEntry ze;
		while((ze = zin.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(FILE);
		@SuppressWarnings("rawtypes")
		Enumeration e = zf.entries();
		while(e.hasMoreElements()){
			ZipEntry ze2 = (ZipEntry)e.nextElement();
			System.out.println("File: " + ze2);
		}
		zf.close();
		
	}

}

你可能感兴趣的:(java,C++,c,C#)