java按照目录结构压缩文件夹以及文件夹内内容

java按照目录结构压缩文件夹以及文件夹内内容

复制代码

 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 }

猜你喜欢

转载自blog.csdn.net/evilcry2012/article/details/83448544