这个总结源于Java编程思想第四版18.11节的案例:
完整代码地址:
相关Api地址:
进行压缩时:
1.创建CheckedOutputStream流,需要传入一个OutputStream流,及检验和对象
2.CheckedOutputStream流做参数创建ZipOutputStream流
3.以ZipOutputStream流做参数创建BufferedOutputStream流,作为真正的输出流
4.得到你需要压缩的文件的输入流
5.根据文件名创建ZipEntry对象(可以为任意字符串,这个被称为Zip条目)
6.调用ZipOutputStream流的putNextEntry()方法,传入上一步创建的ZipEntry。告知流,这个条目要开始写入东西了
7.调用ZipOutputStream流的write()方法,将需要压缩的流写入其中
8.写完一个条目后,调用流的flush()方法
9.关闭流
核心就是:每次向里写入一个新文件时,需要将相关信息包装成ZipEntry,然后需要通过putNextEntry()告知ZipOutputStream流
String[] files = new String[]{...}; CheckOutputStream csum = new CheckOutputStream(new FileOutputStream("test.zip"),new Adler32); ZipOutputStream zos = new ZipOutputStream(csum); BufferedOutputStream out = new BufferedOutputStream(zos); for(String file : files) { BufferedInputStream filein = new BufferedInputStream(new FileInputStream(file)); ZipEntry entry = new ZipEntry(file); //可以对ZipEntry设置很多参数 zos.putNextEntry(entry); int c; while((c=filein.read())!=-1) out.write(c); in.close(); out.flush(); } out.close();
进行解压缩时:
1.创建CheckedInputStream流,需要传入一个InputStream流,及检验和对象
2.CheckedInputStream流做参数创建ZipInputStream流
3.以ZipInputStream流做参数创建BufferedInputStream流,作为真正的输入流
4.通过getNextEntry()告知ZipInputStream流,准备好下一个条目的数据,我需要取出来了
5.从真正输入流中取得数据
CheckInputStream csum = new CheckInputStream(new FileInputStream("test.zip"),new Adler32); ZipInputStream zis = new ZipInputStream(csum); BufferedInputStream in = new BufferedInputStream(zos); while(zis.getNextEntry != null){ int x; while((x=in.read())!=-1) System.out.println(x); }
查看压缩文件信息具体信息时:
1.创建ZipFile对象,传入压缩文件的地址
2.调用getEntries()得到所有的条目
3.遍历条目,输出条目的具体信息
ZipFile zf = new ZipFile("text.zip"); Enumration e = zf.entries(); while(e.hasMoreElements()){ ZipEntry ze = (ZipEntry)e.nextElement(); System.out.prinln(ze); } }
6.关闭流