生成带解压密码的压缩包

由于Java自带的ZipOutPutStream不支持生成带解压密码的压缩包,所以选择了普遍使用的zip4j。

引入依赖

<!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j -->  
<dependency>  
    <groupId>net.lingala.zip4j</groupId>  
    <artifactId>zip4j</artifactId>  
    <version>2.11.5</version>  
</dependency>

demo

package com.exam;  
  
import net.lingala.zip4j.io.outputstream.ZipOutputStream;  
import net.lingala.zip4j.model.ZipParameters;  
import net.lingala.zip4j.model.enums.AesKeyStrength;  
import net.lingala.zip4j.model.enums.CompressionMethod;  
import net.lingala.zip4j.model.enums.EncryptionMethod;  
  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Arrays;  
import java.util.List;  
  
public class ZipOutputStreamExample {  
  
    public static void main(String[] args) {  
        try {  
            zipOutputStreamExample(new File("G:\\out\\result2.zip"), Arrays.asList(new File("G:\\out\\新建文本文档1.txt"),  
                    new File("G:\\out\\新建文本文档1 - 副本.txt"),  
                    new File("G:\\out\\新建文本文档1 - 副本 (2).txt"),  
                    new File("G:\\out\\新建文本文档1 - 副本 (3).txt")), "1234".toCharArray(),  
                    CompressionMethod.DEFLATE, true, EncryptionMethod.ZIP_STANDARD, AesKeyStrength.KEY_STRENGTH_256);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
    public static void zipOutputStreamExample(File outputZipFile, List<File> filesToAdd, char[] password,  
                                              CompressionMethod compressionMethod, boolean encrypt,  
                                              EncryptionMethod encryptionMethod, AesKeyStrength aesKeyStrength)  
            throws IOException {  
  
        ZipParameters zipParameters = buildZipParameters(compressionMethod, encrypt, encryptionMethod, aesKeyStrength);
        byte[] buff = new byte[4096];  
        int readLen;  
  
        try(ZipOutputStream zos = initializeZipOutputStream(outputZipFile, encrypt, password)) {  
            for (File fileToAdd : filesToAdd) {  
  
                // Entry size has to be set if you want to add entries of STORE compression method (no compression)  
                // This is not required for deflate compression                
                if (zipParameters.getCompressionMethod() == CompressionMethod.STORE) {  
                    zipParameters.setEntrySize(fileToAdd.length());  
                }  
  
                zipParameters.setFileNameInZip(fileToAdd.getName());  
                zos.putNextEntry(zipParameters);  
  
                try(InputStream inputStream = new FileInputStream(fileToAdd)) {  
                    while ((readLen = inputStream.read(buff)) != -1) {  
                        zos.write(buff, 0, readLen);  
                    }  
                }  
                zos.closeEntry();  
            }  
        }  
    }  
  
    private static ZipOutputStream initializeZipOutputStream(File outputZipFile, boolean encrypt, char[] password)  
            throws IOException {  
  
        FileOutputStream fos = new FileOutputStream(outputZipFile);  
  
        if (encrypt) {  
            return new ZipOutputStream(fos, password);  
        }  
  
        return new ZipOutputStream(fos);  
    }  
  
    private static ZipParameters buildZipParameters(CompressionMethod compressionMethod, boolean encrypt,  
                                                    EncryptionMethod encryptionMethod, AesKeyStrength aesKeyStrength) {  
        ZipParameters zipParameters = new ZipParameters();  
        zipParameters.setCompressionMethod(compressionMethod);  
        zipParameters.setEncryptionMethod(encryptionMethod);  
        zipParameters.setAesKeyStrength(aesKeyStrength);  
        zipParameters.setEncryptFiles(encrypt);  
        return zipParameters;  
    }  
}

代码部分来源于zip4j

最终效果:
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值