直接上工具类:
package com.ksource.pwlp.util; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import com.github.junrar.Archive; import com.github.junrar.rarfile.FileHeader; public class ZipAndRarUnpackUtil { /** * 解压zip * * @param zipFile * @param descDir * @throws Exception */ public void unZipFiles(File zipFile, String descDir) throws Exception { System.out.println("******************解压开始********************"); File pathFile = new File(descDir); if (!pathFile.exists()) { pathFile.mkdirs(); } ZipFile zip = new ZipFile(zipFile,Charset.forName("GBK")); for (Enumeration entries = zip.entries(); entries.hasMoreElements();) { ZipEntry entry = (ZipEntry) entries.nextElement(); String zipEntryName = entry.getName(); InputStream in = zip.getInputStream(entry); String outPath = (descDir + "/" + zipEntryName).replaceAll("\*", "/"); // 判断路径是否存在,不存在则创建文件路径 File file = new File(outPath.substring(0, outPath.lastIndexOf('/'))); if (!file.exists()) { file.mkdirs(); } // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 if (new File(outPath).isDirectory()) { continue; } OutputStream out = new FileOutputStream(outPath); byte[] buf1 = new byte[1024]; int len; while ((len = in.read(buf1)) > 0) { out.write(buf1, 0, len); } if ((zipEntryName.trim().lastIndexOf("/")) == -1) { } in.close(); out.close(); } System.out.println("******************解压完毕********************"); } /** * 解压rar格式压缩包。 * 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar */ public void unRarFiles(File rarFile, String descDir) throws Exception{ Archive a = null; FileOutputStream fos = null; try{ a = new Archive(rarFile); FileHeader fh = a.nextFileHeader(); while(fh!=null){ if(!fh.isDirectory()){ //1 根据不同的操作系统拿到相应的 destDirName 和 destFileName //String compressFileName = fh.getFileNameString().trim(); String compressFileName = fh.getFileNameW().trim(); if(!existZH(compressFileName)){ compressFileName = fh.getFileNameString().trim(); } String destFileName = ""; String destDirName = ""; //非windows系统 if(File.separator.equals("/")){ destFileName = descDir + compressFileName.replaceAll("\\", "/"); destDirName = destFileName.substring(0, destFileName.lastIndexOf("/")); //windows系统 }else{ destFileName = descDir + compressFileName.replaceAll("/", "\\"); destDirName = destFileName.substring(0, destFileName.lastIndexOf("\")); } //2创建文件夹 File dir = new File(destDirName); if(!dir.exists()||!dir.isDirectory()){ dir.mkdirs(); } //3解压缩文件 fos = new FileOutputStream(new File(destFileName)); a.extractFile(fh, fos); fos.close(); fos = null; } fh = a.nextFileHeader(); } a.close(); a = null; }catch(Exception e){ throw e; }finally{ if(fos!=null){ try{fos.close();fos=null;}catch(Exception e){e.printStackTrace();} } if(a!=null){ try{a.close();a=null;}catch(Exception e){e.printStackTrace();} } } } public static boolean existZH(String str) { String regEx = "[\u4e00-\u9fa5]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); while (m.find()) { return true; } return false; } /** * 文件夹遍历 * @param path * @throws Exception */ public void traverse(String path,String parent_id) throws Exception { System.out.println("path---->" + path); File file = new File(path); Map<String, Object> map = new HashMap<String, Object>(); if (file.exists()) { File[] files = file.listFiles(); if (files.length == 0) { System.out.println("文件夹是空的!"); return; } else { String k_id = UUID.randomUUID().toString(); for (File file2 : files) { if (file2.isDirectory()) {//文件夹 traverse(file2.getAbsolutePath(),parent_id); parent_id = k_id; } else if (file2.isFile()){//文件 } } } } else { System.out.println("文件不存在!"); } } /** * 采用命令行方式解压文件(rar解压会出现版本不一致造成的解压失败,所以用命令方式解压更稳妥) * @param zipFile 压缩文件 * @param destDir 解压结果路径 * @param cmdPath WinRAR.exe的路径,也可以在代码中写死 * @return */ public void realExtract(File rarFile, String destDir) { // 解决路径中存在/..格式的路径问题 destDir = new File(destDir).getAbsoluteFile().getAbsolutePath(); while(destDir.contains("..")) { String[] sepList = destDir.split("\\"); destDir = ""; for (int i = 0; i < sepList.length; i++) { if(!"..".equals(sepList[i]) && i < sepList.length -1 && "..".equals(sepList[i+1])) { i++; } else { destDir += sepList[i] + File.separator; } } } String path = System.getProperty("user.dir"); boolean bool = false; if (rarFile.exists()) { // 开始调用命令行解压,参数-o+是表示覆盖的意思 String cmdPath = path+"\metadata\7zip\7z.exe"; cmdPath = cmdPath .replaceAll(" ", "" "");//所有空格都替换成带有双引号的空格 String cmd = cmdPath + " x " + rarFile.getPath() + " -o" + destDir; System.out.println(cmd); try { Process proc = Runtime.getRuntime().exec(cmd); if (proc.waitFor() != 0) { if (proc.exitValue() == 0) { bool = false; } } else { bool = true; } } catch (Exception e) { e.printStackTrace(); } System.out.println("解压" + (bool ? "成功" : "失败")); } } }
realExtract方法中的7z压缩包路径cmdPath是先将7z压缩包安装完之后拷贝安装路径到项目中去,然后运用cmd命令执行7z压缩包
7z压缩包下载地址:https://www.7-zip.org/a/7z1900-x64.exe