1 import org.apache.commons.io.IOUtils; 2 3 import org.apache.tools.zip.ZipEntry; 4 import org.apache.tools.zip.ZipFile; 5 import org.apache.tools.zip.ZipOutputStream; 6 7 import java.io.*; 8 import java.util.ArrayList; 9 import java.util.Enumeration; 10 import java.util.List; 11 12 /** 13 * @Description: java操作zip文件工具类 14 * @Version: 1.0 15 */ 16 public class ZipFileUtil { 17 18 private static final String ENCODE_UTF_8 = "UTF-8"; 19 20 /** 21 * @param zip 压缩的目的地址 例如:D://zipTest.zip 22 * @param srcFiles 压缩的源文件 23 * @description: 压缩文件或路径 24 * @version: 1.0 25 */ 26 public static void zipFile(String zip, List<File> srcFiles) { 27 try { 28 // 判断是否为压缩后的文件后缀是否为.zip结尾 29 if (zip.endsWith(".zip") || zip.endsWith(".ZIP")) { 30 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(new File(zip))); 31 zipOut.setEncoding(ENCODE_UTF_8);// 设置编码 32 for (File file : srcFiles) { 33 zipFile(zip, zipOut, file, ""); 34 } 35 zipOut.close(); 36 } else { 37 throw new RuntimeException("target file[zip] is not .zip type file"); 38 } 39 } catch (FileNotFoundException e) { 40 throw new RuntimeException(e.getMessage()); 41 } catch (IOException e) { 42 throw new RuntimeException(e.getMessage()); 43 } 44 } 45 46 /** 47 * @param zip 压缩的目的地址 例如:D://zipTest.zip 48 * @param zipOut 49 * @param srcFile 被压缩的文件 50 * @param path 在zip中的相对路径 51 * @version: 1.0 52 */ 53 private static void zipFile(String zip, ZipOutputStream zipOut, File srcFile, String path) throws IOException { 54 System.out.println(" 开始压缩文件[" + srcFile.getName() + "]"); 55 if (!"".equals(path) && !path.endsWith(File.separator)) { 56 path += File.separator; 57 } 58 if (!srcFile.exists()) {// 测试此抽象路径名定义的文件或目录是否存在 59 throw new RuntimeException("压缩失败,文件或目录 " + srcFile + " 不存在!"); 60 } else { 61 if (!srcFile.getPath().equals(zip)) { 62 if (srcFile.isDirectory()) { 63 // listFiles能够获取当前文件夹下的所有文件和文件夹,如果文件夹A下还有文件D,那么D也在childs里。 64 File[] files = srcFile.listFiles(); 65 if (files.length == 0) { 66 zipOut.putNextEntry(new ZipEntry(path + srcFile.getName() + File.separator)); 67 zipOut.closeEntry(); 68 } else { 69 for (File file : files) { 70 zipFile(zip, zipOut, file, path + srcFile.getName()); 71 } 72 } 73 } else { 74 FileInputStream in = new FileInputStream(srcFile); 75 zipOut.putNextEntry(new ZipEntry(path + srcFile.getName())); 76 IOUtils.copy(in, zipOut); 77 in.close(); 78 zipOut.closeEntry(); 79 } 80 } 81 } 82 } 83 84 /** 85 * @param zipPath 待解压缩的ZIP文件路径 86 * @param descDir 目标目录 87 * @return List<File> 88 * @description: 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下 89 * @version: 1.0 90 */ 91 public static List<File> upzipFile(String zipPath, String descDir) { 92 return upzipFile(new File(zipPath), descDir); 93 } 94 95 /** 96 * @param zipFile 解压缩文件 97 * @param descDir 压缩的目标地址,如:D:\测试 或 /mnt/d/测试 98 * @description: 对.zip文件进行解压缩 99 * @version: 1.0 100 */ 101 @SuppressWarnings({"rawtypes", "null"}) 102 public static List<File> upzipFile(File zipFile, String descDir) { 103 List<File> list = new ArrayList<>(); 104 // 防止文件名中有中文时出错 105 System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding")); 106 try { 107 if (!zipFile.exists()) { 108 throw new RuntimeException("解压失败,文件 " + zipFile + " 不存在!"); 109 } 110 ZipFile zFile = new ZipFile(zipFile, "GBK"); 111 InputStream in = null; 112 OutputStream out = null; 113 for (Enumeration entries = zFile.getEntries(); entries.hasMoreElements();) { 114 ZipEntry entry = (ZipEntry) entries.nextElement(); 115 File file = new File(descDir + File.separator + entry.getName()); 116 if (entry.isDirectory()) { 117 file.mkdirs(); 118 } else { 119 File parent = file.getParentFile(); 120 if (!parent.exists()) { 121 parent.mkdirs(); 122 } 123 in = zFile.getInputStream(entry); 124 out = new FileOutputStream(file); 125 IOUtils.copy(in, out); 126 out.flush(); 127 list.add(file); 128 } 129 } 130 zFile.close(); 131 in.close(); 132 out.close(); 133 } catch (IOException e) { 134 throw new RuntimeException(e.getMessage()); 135 } 136 return list; 137 } 138 139 /** 140 * @description: 对临时生成的文件夹和文件夹下的文件进行删除 141 * @param: delpath 142 * @version: 1.0 143 */ 144 public static void deletefile(String delpath) { 145 try { 146 File file = new File(delpath); 147 if (!file.isDirectory()) {// 判断是不是一个目录 148 file.delete(); 149 } else if (file.isDirectory()) { 150 String[] filelist = file.list(); 151 for (int i = 0; i < filelist.length; i++) { 152 File delfile = new File(delpath + File.separator + filelist[i]); 153 if (!delfile.isDirectory()) { 154 delfile.delete(); 155 } else if (delfile.isDirectory()) { 156 deletefile(delpath + File.separator + filelist[i]);// 递归删除 157 } 158 } 159 file.delete(); 160 } 161 } catch (Exception e) { 162 e.printStackTrace(); 163 } 164 } 165 166 167 168 /** 169 * @description: 测试方法 170 * @version: 1.0 171 */ 172 173 public static void main(String[] args) { 174 String zip = "D://zipTest.zip"; 175 List<File> srcFiles = new ArrayList<>(); 176 srcFiles.add(new File("D://testZip")); 177 srcFiles.add(new File("D://999")); 178 zipFile(zip, srcFiles); 179 List<File> list = upzipFile("D://zipTest.zip", "D://Solin"); 180 for (File file : list) { 181 System.out.println(file.getName()); 182 } 183 // deletefile(zip); 184 } 185 }