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 }