• java文件压缩加密,使用流的方式


    使用net.lingala.zip4j来进行文件加密压缩。

    添加依赖net.lingala.zip4j包依赖,这里使用的是最新的包2.11.5版本。

    <dependency>
        <groupId>net.lingala.zip4j</groupId>
        <artifactId>zip4j</artifactId>
        <version>${zip4j.version}</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用ZipFile加密压缩文件

     public static void main(String[] args) throws Exception{
            ZipParameters zipParameters = new ZipParameters();
            zipParameters.setEncryptFiles(true);
            zipParameters.setEncryptionMethod(EncryptionMethod.AES);
            // Below line is optional. AES 256 is used by default. 
            // You can override it to use AES 128. AES 192 is supported only for extracting.
            zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
            List<File> filesToAdd = Arrays.asList(
                new File("F:\\test1.txt"),
                new File("F:\\test2.txt")
            );
            ZipFile zipFile = new ZipFile("F:\\test.zip", "test".toCharArray());
            zipFile.addFiles(filesToAdd, zipParameters);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    执行程序,压缩后:
    在这里插入图片描述
    网上能找到的基本的的参考例子都是这个,但是我们真正使用的时候是不会从本地读取文件的方式的,是使用流的方式,入参,出参都应该是个流。官方文档也提供了使用流的方式压缩文件的。

    使用ZipOutputStream加密压缩文件

    public static void main(String[] args) throws Exception {
            String password = "test";
            List<File> filesToAdd = Arrays.asList(
                new File("F:\\test1.txt"),
                new File("F:\\test2.txt")
            );
            byte[] buff = new byte[4096];
            int readLen;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            try(ZipOutputStream zipOutputStream = new ZipOutputStream(bos, password.toCharArray(), Charset.defaultCharset())) {
                for (File fileToAdd : filesToAdd) {
                    ZipParameters parameters = new ZipParameters();
                    parameters.setEncryptionMethod(EncryptionMethod.AES);
                    parameters.setEncryptFiles(true);
                    parameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
                    parameters.setFileNameInZip(fileToAdd.getName());
                    zipOutputStream.putNextEntry(parameters);
                    try(InputStream inputStream = new FileInputStream(fileToAdd)) {
    //                    zipOutputStream.write(inputStream.readAllBytes());
                        while ((readLen = inputStream.read(buff)) != -1) {
                            zipOutputStream.write(buff, 0, readLen);
                        }
                    }
                    zipOutputStream.closeEntry();
                }
            }
            try (FileOutputStream fileOutputStream = new FileOutputStream("F:\\test.zip")){
                fileOutputStream.write(bos.toByteArray());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    这里说一下像ByteArrayOutputStream这种内存流是不用关闭的,这种的不使用的时候会自动回收了,只有FileOutputStream这种操作了磁盘,或者网络,IO的需要手动关闭,这里放到try块去,自动调用close方法。

    官方文档:https://github.com/srikanth-lingala/zip4j

  • 相关阅读:
    高性能本地缓存Ristretto(二)——过期策略
    GO语言网络编程(并发编程)原子操作(atomic包)
    关于汽车html网页设计完整版,10个以汽车为主题的网页设计与实现
    ArcGIS中ArcMap栅格图层0值设置为NoData值的简便方法
    Rust依赖包下载慢的问题
    RabbitMQ - 02 - 基本消息模型
    大神之路-起始篇 | 第7章.计算机科学导论之【操作系统】学习笔记
    【21天python打卡】第14天 网络爬虫(5)
    [X3m]Ubuntu 根文件系统制作
    web基础和http协议
  • 原文地址:https://blog.csdn.net/u010180738/article/details/134497653