使用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();
			}
	
   }
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
commons-compress是一个Java库,可以用于压缩解压缩多种格式的归档文件,包括zip、tar、gzip等。 要实现zip文件分卷压缩,可以使用commons-compress库提供的ZipArchiveOutputStream类。这个类可以创建一个zip格式的压缩文件,并且支持分卷压缩。 以下是一个示例代码,演示如何使用ZipArchiveOutputStream类实现zip文件分卷压缩: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; public class ZipFileSplitter { public static void main(String[] args) throws IOException { String inputFile = "input.zip"; int maxFileSize = 1024 * 1024; // 1MB String outputFilePrefix = "output_"; String outputFileSuffix = ".zip"; byte[] buffer = new byte[1024]; int count; File input = new File(inputFile); FileInputStream fis = new FileInputStream(input); ZipArchiveOutputStream zos = null; try { int partNumber = 1; long bytesWritten = 0; while (true) { String outputFileName = outputFilePrefix + partNumber + outputFileSuffix; File output = new File(outputFileName); zos = new ZipArchiveOutputStream(new FileOutputStream(output)); zos.setMethod(ZipArchiveOutputStream.DEFLATED); zos.setLevel(9); // 最高压缩级别 while (bytesWritten < maxFileSize && (count = fis.read(buffer)) != -1) { ZipArchiveEntry entry = new ZipArchiveEntry(input.getName()); entry.setSize(count); zos.putArchiveEntry(entry); zos.write(buffer, 0, count); zos.closeArchiveEntry(); bytesWritten += count; } if (count == -1) { break; // 文件读取完毕 } zos.finish(); zos.close(); bytesWritten = 0; partNumber++; } } finally { if (zos != null) { zos.close(); } fis.close(); } } } ``` 这个示例代码将会把一个名为input.zip的文件分卷压缩成多个大小不超过1MB的zip文件,每个文件的文件名形如output_1.zip、output_2.zip等。可以根据需要修改maxFileSize和outputFilePrefix、outputFileSuffix等参数。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值