Zip压缩代码

部分代码引用:【Java代码优化】Zip压缩大文件从30秒到近乎1秒的优化过程(提供源码)_Joker_Ye的博客-CSDN博客

在原来代码上增加hutool ziputil的压缩代码

package com.example.zipdemo;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;

import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipTest {

    private static String ZIP_FILE="D:/Download/test.zip";

    private static String JPG_FILE_PATH="C:\\Users\\gaga\\Downloads\\pic\\";

    private static String JPG_FILE_NAME="img";
    static int max_num = 573;
    public static void zipFileNoBuffer() {
        File zipFile = new File(ZIP_FILE);
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
            //开始时间
            long beginTime = System.currentTimeMillis();

            for (int i = 1; i <= max_num; i++) {
                try (InputStream input = new FileInputStream(JPG_FILE_PATH +"img"+" ("+ i + ").jpg")) {
                    zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
                    int temp = 0;
                    while ((temp = input.read()) != -1) {
                        zipOut.write(temp);
                    }
                }
            }
            printInfo(beginTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void zipFileBuffer() {
        //开始时间
        long beginTime = System.currentTimeMillis();
        File zipFile = new File(ZIP_FILE);
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
             BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(zipOut)) {

            for (int i = 1; i <= max_num; i++) {
                try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(JPG_FILE_PATH +"img"+" ("+ i + ").jpg"))) {
                    zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
                    int temp = 0;
                    while ((temp = bufferedInputStream.read()) != -1) {
                        bufferedOutputStream.write(temp);

                    }
                }
            }
            printInfo(beginTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void zipFileChannel() {
        //开始时间
        long beginTime = System.currentTimeMillis();
        File zipFile = new File(ZIP_FILE);
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
             WritableByteChannel writableByteChannel = Channels.newChannel(zipOut)) {
            for (int i = 1; i <= max_num; i++) {
                try (FileChannel fileChannel = new FileInputStream(JPG_FILE_PATH +"img"+" ("+ i + ").jpg").getChannel()) {
                    zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
                    fileChannel.transferTo(0, fileChannel.size(), writableByteChannel);
                    System.out.println("size:"+fileChannel.size());
                }
            }
            printInfo(beginTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void zipFileMap() {
        //开始时间
        long beginTime = System.currentTimeMillis();
        File zipFile = new File(ZIP_FILE);
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
             WritableByteChannel writableByteChannel = Channels.newChannel(zipOut)) {
            for (int i = 1; i <= max_num; i++) {
                zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
                //内存中的映射文件
                RandomAccessFile raFile=new RandomAccessFile(JPG_FILE_PATH + "img"+" ("+ i + ").jpg", "r");
                MappedByteBuffer mappedByteBuffer = raFile.getChannel()
                        .map(FileChannel.MapMode.READ_ONLY, 0, raFile.length());
                //System.out.println(raFile.length());
                writableByteChannel.write(mappedByteBuffer);
            }
            printInfo(beginTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void zipCopyFileByHutool() {
        long beginTime = System.currentTimeMillis();
        String dirPath = "D:/Download/test";
        for (int i = 1; i <= max_num; i++) {
            String data= (JPG_FILE_PATH +"img"+" ("+ i + ").jpg");
            String fnn= (dirPath +"/" +"img"+ i + ".jpg");
            FileUtil.mkParentDirs(fnn);
            if (!FileUtil.exist(fnn)) {
                FileUtil.copyFile(data, fnn);
            }
        }
        zip(dirPath);
        printInfo(beginTime);

    }
    public static void zipFileByHutool() {
        long beginTime = System.currentTimeMillis();
        File zipFile = new File(ZIP_FILE);
        String dirPath = "D:/Download/test";
        List<File> files = new ArrayList<File>();
        for (int i = 1; i <= max_num; i++) {
            String data= (JPG_FILE_PATH +"img"+" ("+ i + ").jpg");
            files.add(new File(data));
        }
        zip(zipFile,files);
        printInfo(beginTime);

    }

    private static File zip(File zip, List<File> fileList) {
        // 压缩到的位置
        File zipFile = null;
        try {
            // 压缩多个文件,压缩后会将压缩临时文件删除
            zipFile =  ZipUtil.zip(zip,false, fileList.toArray(new File[fileList.size()]));
        } catch (Exception e) {
            System.out.println("文件压缩异常"+ e.getMessage());
        }
        return zipFile;
    }

    public static File zip(String dirPath) {
        // 压缩到的位置
        File zipFile = null;
        try {
            // 压缩多个文件,压缩后会将压缩临时文件删除
            zipFile =  ZipUtil.zip(dirPath);
        } catch (Exception e) {
            System.out.println("文件压缩异常"+ e.getMessage());
        }
        return zipFile;
    }
    public static void printInfo(long beginTime) {
        long endTime= System.currentTimeMillis();
        long total=endTime-beginTime;
        System.out.println(""+total);
        System.out.println("耗時:"+total/ 1000 % 60 );
    }

    public static void main(String[] args) {
//        zipFileNoBuffer();
//        zipFileBuffer();
//        zipFileMap();
        zipCopyFileByHutool();
//        zipFileByHutool();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值