美文网首页
文件压缩(支持文件夹)

文件压缩(支持文件夹)

作者: 骑猪撞大树呦 | 来源:发表于2019-08-20 10:10 被阅读0次

直接上代码

public class ZipUtils {
    private final static Integer TEMP_SIZE = 2048;
    private final static Logger logger = LoggerFactory.getLogger(ZipUtils.class);


    private static void printInfo(long beginTime){
        logger.info("耗时:"+(System.currentTimeMillis() - beginTime));
        System.out.println("耗时:"+(System.currentTimeMillis() - beginTime));
    }

    /**
     * 压缩方法
     * @param zipFile zip文件
     * @param files 文件列表
     */
    public static void zipFilePip(File zipFile,File... files){
        zipFilePip(zipFile, Arrays.asList(files));
    }

    /**
     * 压缩方法
     * @param zipFile zip文件
     * @param files 文件列表
     */
    public static void zipFilePip(String zipFile,String... files){
        List<File> files1 = new ArrayList<>();
        for(String fileStr : files){
            files1.add(new File(fileStr));
        }
        zipFilePip(new File(zipFile),files1);
    }

    /**
     * 压缩方法
     * @param zipFile zip文件
     * @param files 文件列表
     */
    public static void zipFilePip(File zipFile,List<File> files) {

        long beginTime = System.currentTimeMillis();
        try(WritableByteChannel out = Channels.newChannel(ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))))) {
            Pipe pipe = Pipe.open();
            //异步任务
            CompletableFuture.runAsync(()->runTask(pipe,files));

            //获取读通道
            ReadableByteChannel readableByteChannel = pipe.source();
            ByteBuffer buffer = ByteBuffer.allocate(TEMP_SIZE);
            while (readableByteChannel.read(buffer)>= 0) {
                buffer.flip();
                out.write(buffer);
                buffer.clear();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        printInfo(beginTime);

    }

    private static void runTask(Pipe pipe, List<File> files) {

        try(ZipOutputStream zos = new ZipOutputStream(Channels.newOutputStream(pipe.sink()));
            WritableByteChannel out = Channels.newChannel(zos)) {
            for (File file : files) {
                taskFunction(zos,file,out,"");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private static void taskFunction(ZipOutputStream zos,File file,WritableByteChannel out,String base) throws IOException {
        if (file.isDirectory()) {
            File[] files = file.listFiles();

            base = StringUtils.isEmpty(base) ? file.getName() + "/" : base + "/";

            assert files != null;
            for (File file1 : files) {
                taskFunction(zos, file1, out, base + file1.getName());
            }
        } else {
            base = StringUtils.isEmpty(base) ? file.getName() : base;

            zos.putNextEntry(new ZipEntry(base));

            FileChannel fileChannel = new FileInputStream(new File(file.getAbsolutePath())).getChannel();

            fileChannel.transferTo(0, fileChannel.size(), out);

            fileChannel.close();
        }
    }
}
来源:https://juejin.im/post/5d57fb1951882545e41e5de6

相关文章

  • 文件压缩(支持文件夹)

    直接上代码 来源:https://juejin.im/post/5d57fb1951882545e41e5de6

  • linux 压缩和解压缩命令

    压缩文件夹 查看压缩文件夹中的文件 解压文件夹

  • Mac 命令行压缩、分割大文件

    压缩文件或者文件夹 命令行加密压缩文件、文件夹 示例 -P 指定密码 123 密码 -r 文件夹递归处理,压缩文件...

  • mac加密压缩

    mac中利用终端加密压缩文件/文件夹: 首先打开终端, 找到文件夹目录 cd 路径 : 使用命令压缩 压缩文件夹 ...

  • Linux 文件解压缩

    文件夹压缩

  • Linux基础04

    Linux压缩命令 .zip格式压缩 实例:压缩文件 zip 压缩文件名 原文件 实例:压缩文件夹 zip -r ...

  • Python批量压缩图片

    文件夹结构如下 待压缩文件放到文件夹prepare.

  • Linux压缩解压命令

    压缩格式gz,gz只能压缩文件,不能压缩文件夹,不保留原文件 压缩 gzip 文件名 解压缩 gunzip ...

  • linux常用命令

    压缩与解压文件 zip zip -r ./.zip ./*压缩当前文件夹下所有文件 -r代表递归压缩,...

  • Python批量压缩和移动文件

    一、压缩文件:使用zipfile和os 1、压缩单个文件 2、批量压缩 3、压缩整个文件夹 二、移动文件:使用sh...

网友评论

      本文标题:文件压缩(支持文件夹)

      本文链接:https://www.haomeiwen.com/subject/mnsusctx.html