项目中有需要解压zip包,但是网上搜了下,工具类过于局限,故整理一个万能的解压zip的工具类。如果大家有更好的方式欢迎交流!
工具类1:
/** * 解压文件到指定目录 * * @param zipFile 压缩文件 * @param descDir 指定目录 */ public static void unZipFiles(File zipFile, String descDir) throws IOException { File pathFile = new File(descDir); if (!pathFile.exists()) { Assert.state(pathFile.mkdirs(), "无法创建目录/文件:" + pathFile); } /* * ZipFile类用于从zip文件中读取条目 * getEntries()返回ZIP文件条目中的枚举 */ ZipFile zip = new ZipFile(zipFile); for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) entries.nextElement(); //解决Linux乱码 entry.setUnixMode(644); String zipEntryName = entry.getName(); log.debug(zipEntryName); InputStream in = zip.getInputStream(entry); String outPath = (descDir + zipEntryName).replaceAll("\\*", "/"); //判断路径是否存在,不存在则创建文件路径 File file = new File(outPath.substring(0, outPath.lastIndexOf(File.separator))); if (!file.exists()) { Assert.state(file.mkdirs(), "无法创建目录/文件:" + file.getAbsolutePath()); } //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 if (new File(outPath).isDirectory()) { continue; } OutputStream out = new FileOutputStream(outPath); byte[] buf = new byte[BUFFER_SIZE]; int len; //Java获取byte数值保存到指定目录 while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } log.info("*******************解压完毕********************"); }
局限点:只支持解压zip包中只包含文件,不包含文件夹的zip
工具类2:
/** * 解压文件到指定目录 * * @param zipFile 压缩文件 * @param descDir 指定目录 */ public static void unZipFiles(File zipFile, String descDir) throws IOException { File pathFile = new File(descDir); if (!pathFile.exists()) { Assert.state(pathFile.mkdirs(), "无法创建目录/文件:" + pathFile); } /* * ZipFile类用于从zip文件中读取条目 * getEntries()返回ZIP文件条目中的枚举 */ ZipFile zip = new ZipFile(zipFile); for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) entries.nextElement(); //解决Linux乱码 entry.setUnixMode(644); String zipEntryName = entry.getName(); log.debug(zipEntryName); InputStream in = zip.getInputStream(entry); String outPath = (descDir + zipEntryName).replaceAll("\\*", "/"); //判断路径是否存在,不存在则创建文件路径 File file = new File(outPath.substring(0, outPath.lastIndexOf("/"))); if (!file.exists()) { Assert.state(file.mkdirs(), "无法创建目录/文件:" + file.getAbsolutePath()); } //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 if (new File(outPath).isDirectory()) { continue; } OutputStream out = new FileOutputStream(outPath); byte[] buf = new byte[BUFFER_SIZE]; int len; //Java获取byte数值保存到指定目录 while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } log.info("*******************解压完毕********************"); }
局限点:只能解压zip包下为文件夹的zip
工具类3:(推荐)
/** * 解压文件到指定目录,包含解压带文件夹和不带文件夹的zip(万能) * * @param srcFile 压缩文件 * @param destDirPath 指定目录 */ public static void unZipFilesSecond(File srcFile,String destDirPath) throws Exception { if (!srcFile.exists()) { throw new Exception(srcFile.getPath() + "所指文件不存在"); } //创建压缩文件对象 ZipFile zipFile = new ZipFile(srcFile); log.info("*******************开始解压********************"); Enumeration<?> entries = zipFile.getEntries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); // 如果是文件夹,就创建个文件夹 if (entry.isDirectory()) { String dirPath = destDirPath + "/" + entry.getName(); srcFile.mkdirs(); } else { // 如果是文件,就先创建一个文件,然后用io流把内容copy过去 File targetFile = new File(destDirPath + "/" + entry.getName()); // 保证这个文件的父文件夹必须要存在 if (!targetFile.getParentFile().exists()) { targetFile.getParentFile().mkdirs(); } targetFile.createNewFile(); // 将压缩文件内容写入到这个文件中 InputStream is = zipFile.getInputStream(entry); FileOutputStream fos = new FileOutputStream(targetFile); int len; byte[] buf = new byte[1024]; while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } // 关流顺序,先打开的后关闭 fos.close(); is.close(); } } log.info("*******************解压完毕********************"); }
可以解压zip包下含有文件和文件夹的zip