本文共 3600 字,大约阅读时间需要 12 分钟。
package zipDemo;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;/** * 用Java中的Zip进行多文件的保存练习 * @author 於之 * */public class Zip { public static void main(String[] args) throws Exception{ /** * 压缩多个文件(zip可以压缩任何文件,包括二进制文件) * 将多个文件压缩到同一个压缩文件中 */ args = new String[3]; args[0] = "d:/file/a.txt"; args[1] = "d:/file/b.txt"; args[2] = "d:/file/c.txt"; /** * 压缩文件存放的路径以及名称 */ FileOutputStream f = new FileOutputStream("d:/file/abc.zip"); /** * 作用是为任何OutputStream产生校验和 * 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种) */ CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32()); /** * 用于将数据压缩成Zip文件格式 */ ZipOutputStream zos = new ZipOutputStream(csum); BufferedOutputStream out = new BufferedOutputStream(zos); zos.setComment("A test of Java Zipping"); //添加注释 int i=1; for(String arg : args){//一次对需要压缩的文件依次操作 System.out.println("writing file: "+arg); BufferedReader in = new BufferedReader(new FileReader(arg)); /** * 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法 * 参数是一个 ZipEntry(String arg)对象,arg表示文件的路径,可以直接使用被压缩文件的路径作为压缩包中 * 文件的路径,也可以自己重新定义每个文件在压缩包中的路径 * * ZipEntry只有CRC校验和类型 */ zos.putNextEntry(new ZipEntry("file/"+i+".txt")); //同一个压缩包中文件名不能一样 i++; 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/abc.zip"); CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32()); ZipInputStream in2 = new ZipInputStream(csumi); BufferedInputStream bis = new BufferedInputStream(in2); /** * 从ZipInputStream中获取NextEntry对象 */ //ZipEntry ze=in2.getNextEntry(); 如果在循环外面获取NextEntry,那么只会执行一次,本例中ze永远等于file/1.txt ZipEntry ze; while((ze=in2.getNextEntry())!=null){ System.out.println("Reading file "+ze); int x; byte[] car=new byte[1024]; while((x=bis.read())!=-1){ System.out.write(x); //将文件读取的内容打印到控制台 } } if(args.length==1)System.out.println("Checksum: "+csumi.getChecksum().getValue()); bis.close(); /** * 解压文件的第二种方法 直接使用ZipFile对象 */ ZipFile zf = new ZipFile("d:/file/abc.zip"); Enumeration e = zf.entries(); while(e.hasMoreElements()){ ZipEntry ze2 = (ZipEntry) e.nextElement(); System.out.println("File:ZipEntry: "+ze2); } } }
转载地址:http://iscii.baihongyu.com/