1. 程式人生 > 其它 >使用zip4j完成檔案打成zip,加密與解密

使用zip4j完成檔案打成zip,加密與解密

技術標籤:工作日常遇到的問題javazip

1.引入依賴

<dependency>
      <groupId>net.lingala.zip4j</groupId>
      <artifactId>zip4j</artifactId>
      <version>1.3.2</version>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

2.加密程式碼
2.1判空

public static boolean isEmpty(Object ob) {
        if (ob == null) {
            return true;
        } else {
            if (ob instanceof String) {
                if (((String)ob).length() == 0) {
                    return true;
                }
            } else if (ob instanceof Collection) {
                if (((Collection)ob).size() == 0) {
                    return true;
                }
            } else if (ob instanceof Map) {
                if (((Map)ob).size() == 0) {
                    return true;
                }
            }

            return false;
        }
    }

2.2建立壓縮檔案存放目錄,比如指定的存放路徑並沒有被建立

private static void createDestDirectory(String destParam){
        File destDir=null;
        if(destParam.endsWith(File.separator)){
            destDir=new File(destParam);
        }else {
            destDir=new File(destParam.substring(0,destParam.lastIndexOf(File.separator)));
        }

        if(!destDir.exists()){
            destDir.mkdirs();
        }
    }

2.3構建壓縮檔案存放路徑,如果不存在將會建立

private static String createZipFilePath(File srcFile, String destParam){
        if(isEmpty(destParam)){
            if(srcFile.isDirectory()){
                destParam=srcFile.getParent()+File.separator+srcFile.getName()+".zip";
            }else {
                String fileName=srcFile.getName().substring(0,srcFile.getName().lastIndexOf('.'));
                destParam=srcFile.getParent()+File.separator+fileName+".zip";
            }

        }else {
            createDestDirectory(destParam);
            if(destParam.endsWith(File.separator)){
                String fileName="";
                if (srcFile.isDirectory()) {
                    fileName=srcFile.getName();
                }else {
                    fileName=srcFile.getName().substring(0,srcFile.getName().lastIndexOf('.'));
                }
                destParam +=fileName+".zip";
            }
        }
        return destParam;
    }

2.4使用給定密碼壓縮指定檔案或資料夾到指定位置

public static String zip(String src,String dest,boolean isCreatDir,String password) throws Exception{
        File srcFile = new File(src);
        dest=createZipFilePath(srcFile,null);
        ZipParameters zp = new ZipParameters();
        //壓縮方式
        zp.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        //壓縮級別
        zp.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        //加密
        if(!isEmpty(password)){
            zp.setEncryptFiles(true);
            //加密方式
            zp.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
            zp.setPassword(password.toCharArray());
        }
        ZipFile zf = new ZipFile(dest);
        if(srcFile.isDirectory()){
            if(!isCreatDir){
                File[] subFiles = srcFile.listFiles();
                if(subFiles.length>0 && subFiles !=null){
                    for(File file:subFiles){
                        if(file.isDirectory()){
                            zf.addFolder(file,zp);
                        }else {
                            zf.addFile(file, zp);
                        }
                    }
                }
                return dest;
            }
            zf.addFolder(srcFile, zp);
        }else {
            zf.addFile(srcFile, zp);
        }

        return "dest";
    }

3.解密

public static void unZipByPw(File src,String dest,String password) throws Exception{
        if(!src.exists()){
            throw new ZipException("檔案不存在");
        }
        ZipFile zipFile = new ZipFile(src);
        if (!zipFile.isValidZipFile()) {
            throw new ZipException("檔案不合法或不存在");
        }
        zipFile.setFileNameCharset(DEFAULT_ENCODING);
        //檢查是否需要密碼
        if (zipFile.isEncrypted()) {
            zipFile.setPassword(password);
        }
        List<FileHeader> fileHeaders = zipFile.getFileHeaders();
        BufferedWriter bw=null;
        BufferedReader br=null;
        try{
            for(int i=0,size=fileHeaders.size();i<size;i++){
                FileHeader  fd = fileHeaders.get(i);
                br = new BufferedReader(new InputStreamReader(zipFile.getInputStream(fd)));
                bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest)));
                String line;
                while((line=br.readLine() )!=null){
                    bw.write(line);
                    bw.write("\n");
                }
                bw.flush();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{if(bw !=null){ bw.close();}}catch (Exception e){e.printStackTrace();}
            try{if(br !=null){ br.close();}}catch (Exception e){e.printStackTrace();}
        }
    }

4.測試

public static void main(String[] args) {
        /*try {
            ZipUtil.zip("C:\\Users\\lyj\\Desktop\\cs.cvs","1234");
        } catch (Exception e) {
            e.printStackTrace();
        }*/
        File src = new File("C:\\Users\\lyj\\Desktop\\cs.zip");
        String dest="C:\\Users\\lyj\\Desktop\\cs.xls";
        try {
            ZipUtil.unZipByPw(src,dest,"1234");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }