1 package com.basis.utils;
2
3 import java.io.BufferedInputStream;
4 import java.io.BufferedOutputStream;
5 import java.io.File;
6 import java.io.FileInputStream;
7 import java.io.FileOutputStream;
8 import java.util.zip.ZipEntry;
9 import java.util.zip.ZipOutputStream;
10
11 public class ZipCompress {
12 private String zipFileName; // 目的地Zip文件
13 private String sourceFileName; //源文件(带压缩的文件或文件夹)
14
15 public ZipCompress(String zipFileName,String sourceFileName)
16 {
17 this.zipFileName=zipFileName;
18 this.sourceFileName=sourceFileName;
19 }
20
21 public void zip() throws Exception
22 {
23 //File zipFile = new File(zipFileName);
24 System.out.println("压缩中...");
25
26 //创建zip输出流
27 ZipOutputStream out = new ZipOutputStream( new FileOutputStream(zipFileName));
28
29 //创建缓冲输出流
30 BufferedOutputStream bos = new BufferedOutputStream(out);
31
32 File sourceFile = new File(sourceFileName);
33
34 //调用函数
35 compress(out,bos,sourceFile,sourceFile.getName());
36
37 bos.close();
38 out.close();
39 System.out.println("压缩完成");
40
41 }
42
43 public void compress(ZipOutputStream out,BufferedOutputStream bos,File sourceFile,String base) throws Exception
44 {
45 //如果路径为目录(文件夹)
46 if(sourceFile.isDirectory())
47 {
48
49 //取出文件夹中的文件(或子文件夹)
50 File[] flist = sourceFile.listFiles();
51
52 if(flist.length==0)//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
53 {
54 System.out.println(base+"/");
55 out.putNextEntry( new ZipEntry(base+"/") );
56 }
57 else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
58 {
59 for(int i=0;i<flist.length;i++)
60 {
61 compress(out,bos,flist[i],base+"/"+flist[i].getName());
62 }
63 }
64 }
65 else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
66 {
67 out.putNextEntry( new ZipEntry(base) );
68 FileInputStream fos = new FileInputStream(sourceFile);
69 BufferedInputStream bis = new BufferedInputStream(fos);
70
71 int tag;
72 System.out.println(base);
73 //将源文件写入到zip文件中
74 while((tag=bis.read())!=-1)
75 {
76 out.write(tag);
77 }
78 bis.close();
79 fos.close();
80
81 }
82 }
83 }