zoukankan      html  css  js  c++  java
  • Java 压缩成zip文件

    综述

    在《 把多个文件打包压缩成tar.gz文件并解压的Java实现》中介绍了如何把文件压缩车gz文件,这里介绍如何把文件压缩成zip文件。支持如下方式的压缩:

    • 压缩单个文件
    • 压缩文件夹下的所有文件

    源码

    话不多说,直接上源代码:

         /**
         *  压缩指定文件夹中的所有文件,生成指定名称的zip压缩包
         *
         * @param sourcePath 需要压缩的文件名称列表(包含相对路径)
         * @param zipOutPath 压缩后的文件名称
         **/
        public static void batchZipFiles(String sourcePath, String zipOutPath) {
            ZipOutputStream zipOutputStream = null;
            WritableByteChannel writableByteChannel = null;
            MappedByteBuffer mappedByteBuffer = null;
            try {
                zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOutPath));
                writableByteChannel = Channels.newChannel(zipOutputStream);
                File file = new File(sourcePath);
                for (File source : file.listFiles()) {
                    long fileSize = source.length();
                    //利用putNextEntry来把文件写入
                    zipOutputStream.putNextEntry(new ZipEntry(source.getName()));
                    long read = Integer.MAX_VALUE;
                    int count = (int) Math.ceil((double) fileSize / read);
                    long pre = 0;
                    //由于一次映射的文件大小不能超过2GB,所以分次映射
                    for (int i = 0; i < count; i++) {
                        if (fileSize - pre < Integer.MAX_VALUE) {
                            read = fileSize - pre;
                        }
                        mappedByteBuffer = new RandomAccessFile(source, "r").getChannel()
                                .map(FileChannel.MapMode.READ_ONLY, pre, read);
                        writableByteChannel.write(mappedByteBuffer);
                        pre += read;
                    }
                }
                mappedByteBuffer.clear();
            } catch (Exception e) {
                log.error("Zip more file error, fileNames: " + sourcePath, e);
            } finally {
                try {
                    if (null != zipOutputStream) {
                        zipOutputStream.close();
                    }
                    if (null != writableByteChannel) {
                        writableByteChannel.close();
                    }
                    if (null != mappedByteBuffer) {
                        mappedByteBuffer.clear();
                    }
                } catch (Exception e) {
                    log.error("Zip more file error, file names are:" + sourcePath, e);
                }
            }
        }
    

    小结

      如果您在工作过程中遇到有关zip的压缩问题,不妨在下方留言,大家一起来应对助您解决问题。如果感觉本文对您有帮助,请点赞并收藏。

    Reference


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    [树形dp] Luogu P4516 潜入行动
    [kruskal][Trie] Codeforces 888G Xor-MST
    [线性基] Luogu P4151 最大XOR和路径
    [线段树] Luogu P4560 砖墙
    [递归][重心] Luogu P4886 快递员
    [Trie][贪心][堆] LibreOJ #3048 异或粽子
    [长链剖分][优先队列] LibreOJ #3052 春节十二响
    [支配树] Bzoj P2815 灾难
    [长链剖分][线段树] Bzoj P1758 重建计划
    [dsu on tree] Codeforces 600E Lomsat gelral
  • 原文地址:https://www.cnblogs.com/east7/p/15731499.html
Copyright © 2011-2022 走看看