• Zip文件和RAR文件解压


    直接上工具类:

    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
  • 相关阅读:
    无编译/无服务器,实现浏览器的 CommonJS 模块化
    程序员如何在工作中自我增值
    软件架构被高估,清晰简单的设计被低估
    为什么会产生微服务架构?
    版本管理Git和SVN的介绍及其优缺点
    13.递归第一次
    12.二叉树的序遍历
    12.二叉树的序遍历
    10.十进制转m进制
    10.十进制转m进制
  • 原文地址:https://www.cnblogs.com/henuyuxiang/p/10767135.html
Copyright © 2020-2023  润新知