1     /**
 2      * 该方法递归实现将多个文件夹压缩在同一个zip包中 然后删除文件夹directoryName 下需要被压缩的文件。
 3      * @param directoryName 文件夹路径
 4      * @param zos           压缩流 ZipOutputStream 确定压缩包生成的位置
 5      * @param basePath      用于传给 ZipEntry 用于压缩包分文件夹第一级传入可以为""
 6      * @throws IOException
 7      */
 8     public static void zipDir(String directoryName, ZipOutputStream zos, String basePath) {
 9         File file = new File(directoryName);
10         // 每一级别的递归 basePath 不应该被改变所以添加一个 参数 copyBasePath
11         String copyBasePath ="";
12         if (file.exists()) {
13             File[] fileList = file.listFiles();
14             for (File f : fileList) {
15                 if (f.isDirectory()) {
16                     // 拼接文件夹目录
17                     if (!"".equals(basePath)) {
18                         copyBasePath = basePath+File.separator+f.getName();
19                     } else {
20                         copyBasePath = f.getName();
21                     }
22                     // 继续递归文件夹
23                     zipDir(directoryName + File.separator + f.getName(), zos, copyBasePath);
24                 } else {
25                     // 压缩单个文件到 zos
26                     String zipName;
27                     if (!"".equals(basePath)) {
28                         zipName = basePath + File.separator + f.getName();
29                     } else {
30                         zipName = f.getName();
31                     }
32                     try {
33                         // zos.putNextEntry  开始添加压缩文件  ZipEntry传入的参数 zipName如果包含了层级关系就会生成文件夹
34                         zos.putNextEntry(new ZipEntry(zipName));
35                         int len;
36                         FileInputStream is = new FileInputStream(f);
37                         byte[] bytes = new byte[1024];
38                         while ((len = is.read(bytes)) != -1) {
39                             zos.write(bytes, 0, len);
40                         }
41                         zos.flush();
42                         // zos.closeEntry()   结束当前压缩文件的添加
43                         zos.closeEntry();
44                         is.close();
45                     } catch (FileNotFoundException e) {
46                         e.printStackTrace();
47                     } catch (IOException e) {
48                         e.printStackTrace();
49                     }
50                 }
51                 Boolean isDelete = f.delete();
52                 System.out.println(f.getName()+"删除是否成功: "+isDelete);
53             }
54         }
55     }
01-10 10:48