使用Zip4j分卷压缩和解压缩

  • 添加Maven依赖,zip4j.jar包
        <dependency>
			  <groupId>net.lingala.zip4j</groupId>
              <artifactId>zip4j</artifactId>
              <version>1.3.2</version>
       </dependency>
  • 分卷压缩(支持多个文件的合并压缩和使用指定密码)
    /**
    * 分卷压缩
    * @param srcFiles 要压缩的文件绝对路径列表(支持多个文件的合并压缩)
    * @param destFile 要压缩的zip文件名
    * @param passwd   压缩密码
    * @param fileSize 分卷大小
    * @return 压缩文件路径(如分卷会返回以 "," 分隔的文件路径列表)
    * @throws ZipException
    */
    public static String zip(List<String> srcFiles,String destFile, String passwd,long fileSize) throws ZipException{
    	String zipFiles = null;
	   	File tmpFile = new File(destFile);
	   	if(tmpFile.exists()){
	   		tmpFile.delete();
	   	}
	   	
	   	net.lingala.zip4j.core.ZipFile zipFile = new net.lingala.zip4j.core.ZipFile(destFile);
	   	
	   	ArrayList<File> filesToAdd = new ArrayList<File>();
	   	if(srcFiles!=null&&srcFiles.size()>0){
	   		
	   		int fileCount = srcFiles.size();
	   		for(int i=0;i<fileCount;i++){
	   			filesToAdd.add(new File(srcFiles.get(i)));
	   		}
	   		
	        ZipParameters parameters = new ZipParameters();
	        if(!StringUtil.isBlank(passwd)) { 
	            parameters.setEncryptFiles(true);  
	            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
	            parameters.setPassword(passwd.toCharArray());
	        }
	        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
	
	        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
	        
	        //未指定则设置为512KB
	        if(fileSize==0){
	        	fileSize = 65536;
	        }
	        zipFile.createZipFile(filesToAdd, parameters, true, fileSize);
	   	
	        @SuppressWarnings("unchecked")
			ArrayList<String> zipList = zipFile.getSplitZipFiles();
            if(zipList!=null&&zipList.size()>0){
            	String surFix = ".z010";
            	String surFixReplace = ".z10";
            	for(int i=0;i<zipList.size();i++){//针对第10个包的文件名做特殊处理
                	String file = zipList.get(i).trim();
                	int length = file.length();
                	String surFixTmp = file.substring(length-5, length);
                	if(surFix.equals(surFixTmp)){
                		file = file.replace(surFix, surFixReplace);
                	}
                	zipList.set(i, file);
                }
                String[] zipArray = new String[zipList.size()];
                zipList.toArray(zipArray);
                zipFiles = Arrays.toString(zipArray);
                
                int length = zipFiles.length();
                zipFiles = zipFiles.substring(1, length - 1);
            } 	
	    }
	   	return zipFiles;
   }
  • 解压指定的ZIP压缩文件到指定目录 (支持分卷压缩解压和使用指定密码)
	/** 
     * 解压缩(支持分卷压缩解压)
     * @param zipFilePath 指定的ZIP压缩文件 路径
     * @param dest 解压目录 
     * @param passwd ZIP文件的密码 。需要解压密码时必须传入,否则传入null即可
     * @return  解压后文件名数组 
     * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 
     */  
    @SuppressWarnings("unchecked")
	public static String[] unzip(String zipFilePath, String dest, String passwd) throws ZipException {
    	File zipFile = new File(zipFilePath);
    	net.lingala.zip4j.core.ZipFile zFile = new net.lingala.zip4j.core.ZipFile(zipFile);
        zFile.setFileNameCharset("GBK");
        if(!zFile.isValidZipFile()) {
            throw new ZipException("压缩文件不合法,可能被损坏!");
        }
        
        File destDir = new File(dest);  
        if(destDir.isDirectory() && !destDir.exists()) {  
            destDir.mkdir();  
        }
        
        if(zFile.isEncrypted()) {
        	if(StringUtil.isBlank(passwd)) {
        		throw new ZipException("文件已加密,需要解压密码,解压密码不能为空!");
        	}else {
        		zFile.setPassword(passwd.toCharArray());
        	}
        }
        zFile.extractAll(dest);
        
        List<String> extractedFileList = new ArrayList<String>();
        
        List<FileHeader> headerList = zFile.getFileHeaders();
        if(headerList!=null&&headerList.size()>0) {
        	for(FileHeader fileHeader:headerList) {
                if(!fileHeader.isDirectory()) {
                    extractedFileList.add(fileHeader.getFileName());
                }
            }
        }
        
        String[] extractedFiles = new String[extractedFileList.size()];
        extractedFileList.toArray(extractedFiles);
        return extractedFiles;
    }
  • main
   public static void main(String[] args) {
	   
	     //带压缩文件集合
	   	List<String> srcFiles = new ArrayList<String>();
	   	srcFiles.add("C:/test/a.xls");
	   	srcFiles.add("C:/test/b.xls");
	   	srcFiles.add("C:/test/c.xls");
	   	srcFiles.add("C:/test/d.xls");

	   	String destFile = "C:/test/a.zip"; //压缩路径
	   	
	   	String passwd  = "123"; //压缩包密码
	   	long fileSize = 65536; //分卷大小(当前为最小值)
	   	
	   	try {
				//1.压缩
				System.out.println(zip(srcFiles,destFile,passwd,fileSize));
	   		
	   			//2.解压
	   			String[] extractedFiles=unzip(destFile, "C:/test/a", passwd);
	   			for (int i = 0; i < extractedFiles.length; i++) {
	   				System.out.println(extractedFiles[i]);
				}
				
			} catch (ZipException e) {
				e.printStackTrace();
			}
	
   }
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值