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);
}
}
}
Java中的Zip进行多文件的保存
最新推荐文章于 2024-07-10 10:25:26 发布