ZipUtils工具类

package com.xiaobu.base.util;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * @author xiaobu
 * @version JDK1.8.0_171
 * @date on  2019/7/25 10:54
 * @description zip压缩解压工具类
 */
@Slf4j
public class ZipUtil {

    private static final int BUFFER_SIZE = 4096;

    /**
     * 功能描述:压缩单个文件
     *
     * @param filePath, outPut
     * @return void
     * @author xiaobu
     * @date 2019/7/25 10:55
     * @version 1.0  file.getName().split("\\.")[0].concat(".zip") windows情况
     */
    public static void compressSingleFile(String filePath, String outPut) {
        try {
            File file = new File(filePath);
            String zipFileName = file.getName().split("\\.")[0].concat(".zip");
            System.out.println("zipFileName:" + zipFileName);
            System.out.println("1234 = " + outPut + File.separator + zipFileName);
            FileOutputStream fos = new FileOutputStream(outPut + File.separator + zipFileName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            zos.putNextEntry(new ZipEntry(file.getName()));
            byte[] bytes = Files.readAllBytes(Paths.get(filePath));
            zos.write(bytes, 0, bytes.length);
            zos.closeEntry();
            zos.close();
        } catch (FileNotFoundException ex) {
            System.err.format("The file %s does not exist", filePath);
        } catch (IOException ex) {
            System.err.println("I/O error: " + ex);
        }
    }


    /**
     * 功能描述:压缩多个文件
     *
     * @param files, outputStream]
     * @return void
     * @author xiaobu
     * @date 2019/11/27 15:34
     * @version 1.0
     */
    public static void compressZip(List<File> files, OutputStream outputStream) {
        ZipOutputStream zipOutStream = null;
        try {
            //-- 包装成ZIP格式输出流
            zipOutStream = new ZipOutputStream(new BufferedOutputStream(outputStream));
            // -- 设置压缩方法
            zipOutStream.setMethod(ZipOutputStream.DEFLATED);
            //-- 将多文件循环写入压缩包
            for (int i = 0; i < files.size(); i++) {
                File file = files.get(i);
                FileInputStream filenputStream = new FileInputStream(file);
                byte[] data = new byte[(int) file.length()];
                filenputStream.read(data);
                //-- 添加ZipEntry,并ZipEntry中写入文件流,这里,加上i是防止要下载的文件有重名的导致下载失败
                zipOutStream.putNextEntry(new ZipEntry(file.getName()));
                zipOutStream.write(data);
                filenputStream.close();
                zipOutStream.closeEntry();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (Objects.nonNull(zipOutStream)) {
                    zipOutStream.flush();
                    zipOutStream.close();
                }
                if (Objects.nonNull(outputStream)) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 功能描述:解压
     *
     * @param zipFilePath, destDirectory]
     * @return void
     * @author xiaobu
     * @date 2019/11/27 15:26
     * @version 1.0
     */
    public static void unzip(String zipFilePath, String destDirectory) throws IOException {
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry entry = zipIn.getNextEntry();
        // iterates over entries in the zip file
        while (entry != null) {
            String filePath = destDirectory + File.separator + entry.getName();
            if (!entry.isDirectory()) {
                // if the entry is a file, extracts it
                extractFile(zipIn, filePath);
            } else {
                // if the entry is a directory, make the directory
                File dir = new File(filePath);
                dir.mkdir();
            }
            zipIn.closeEntry();
            entry = zipIn.getNextEntry();
        }
        zipIn.close();
    }


    public static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = zipIn.read(bytesIn)) != -1) {
            bos.write(bytesIn, 0, read);
        }
        bos.close();
    }


    public static void main(String[] args) {
/*        String filePath = "D:\\thw\\8888老地方大饼专卖店2019-07-24现场工作.xlsx";
        String outPut = "D:\\thw";
        compressSingleFile(filePath,outPut);*/
      /*  File file1 = new File("D:\\thw\\1.ftl");
        File file2 = new File("D:\\thw\\2.ftl");
        List<File> files = new ArrayList<>();
        files.add(file1);
        files.add(file2);
        try {
            FileOutputStream fileOutputStream = new FileOutputStream("D:\\thw\\1.zip");
            compressZip(files, fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }*/
        long beginTime = System.currentTimeMillis();
        String zipPath = "D:\\thw\\test.zip";
        String destPath = "D:\\thw\\test";
        try {
            unzip(zipPath, destPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(System.currentTimeMillis() - beginTime);
    }

}

发布了152 篇原创文章 · 获赞 18 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/tanhongwei1994/article/details/103277167