Java Zip工具类,全

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@Slf4j
public class ZipUtils {

    /**
     * 将存放在sourceFilePath目录下的源文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下
     * @param sourceFilePath 待压缩的文件路径
     * @param zipFilePath 压缩后存放路径
     * @param fileName 压缩后文件的名称
     * @return
     */
    public static boolean folderToZip(String sourceFilePath, String zipFilePath, String fileName) {
        boolean flag = false;
        File sourceFile = new File(sourceFilePath);
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;

        if (sourceFile.exists() == false) {
            log.info("待压缩的文件目录:" + sourceFilePath + "不存在.");
            return false;
        } else {
            try {
                File zipFile = new File(zipFilePath + "/" + fileName + ".zip");
                if (zipFile.exists()) {
                    log.info(zipFilePath + "目录下存在名字为:" + fileName + ".zip" + "打包文件.");
                    return false;
                } else {
                    File[] sourceFiles = sourceFile.listFiles();
                    if (null == sourceFiles || sourceFiles.length < 1) {
                        log.error("待压缩的文件目录:" + sourceFilePath + "里面不存在文件,无需压缩.");
                        return false;
                    } else {
                        try {
                            fos = new FileOutputStream(zipFile);
                        } catch (FileNotFoundException e) {
//                            e.printStackTrace();
                            log.error(e.getMessage());
                        } finally {
                            if ( null != fos ){
                                fos.close();
                            }
                        }
                        try {
                            zos = new ZipOutputStream(new BufferedOutputStream(fos));
                        } catch (Exception e) {
//                            e.printStackTrace();
                            log.error(e.getMessage());
                        } finally {
                            if ( null != zos ){
                                zos.close();
                            }
                        }
                        byte[] bufs = new byte[1024 * 10];
                        for (int i = 0; i < sourceFiles.length; i++) {
                            // 创建ZIP实体,并添加进压缩包
                            ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());
                            zos.putNextEntry(zipEntry);
                            // 读取待压缩的文件并写进压缩包里
                            try {
                                fis = new FileInputStream(sourceFiles[i]);
                            } catch (FileNotFoundException e) {
//                                e.printStackTrace();
                                log.error(e.getMessage());
                            } finally {
                                if ( null != fis ){
                                    fis.close();
                                }
                            }
                            try {
                                bis = new BufferedInputStream(fis, 1024 * 10);
                            } catch (Exception e) {
//                                e.printStackTrace();
                                log.error(e.getMessage());
                            } finally {
                                if ( null != bis ){
                                    bis.close();
                                }
                            }
                            int read = 0;
                            while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                                zos.write(bufs, 0, read);
                            }
                        }
                        flag = true;
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                // 关闭流
                try {
                    if (null != bis){
                        bis.close();
                    }
                    if (null != zos){
                        zos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    /**
     * 将sourceFilePath文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下
     * @param sourceFilePath 待压缩的文件路径
     * @param zipFilePath 压缩后存放路径
     * @param fileName 压缩后文件的名称
     * @return
     */
    public static boolean fileToZip(String sourceFilePath, String zipFilePath, String fileName) {
        boolean flag = false;
        File sourceFile = new File(sourceFilePath);
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        if (sourceFile.exists() == false) {
            log.info("待压缩的文件:" + sourceFilePath + "不存在.");
            return false;
        } else {
            try {
                File zipFile = new File(zipFilePath + "/" + fileName + ".zip");
                if (zipFile.exists()) {
                    log.info(zipFilePath + "目录下存在名字为:" + fileName + ".zip" + "打包文件.");
                    return false;
                } else {
                    try {
                        fos = new FileOutputStream(zipFile);
                    } catch (FileNotFoundException e) {
//                        e.printStackTrace();
                        log.error(e.getMessage());
                    } finally {
                        if (null != fos ){
                            fos.close();
                        }
                    }
                    try {
                        zos = new ZipOutputStream(new BufferedOutputStream(fos));
                    } catch (Exception e) {
//                        e.printStackTrace();
                        log.error(e.getMessage());
                    } finally {
                        if (null != zos ){
                            zos.close();
                        }
                    }
                    byte[] bufs = new byte[1024 * 10];
                    // 创建ZIP实体,并添加进压缩包
                    ZipEntry zipEntry = new ZipEntry(sourceFile.getName());
                    if ( zos != null ){
                        zos.putNextEntry(zipEntry);
                    }
                    // 读取待压缩的文件并写进压缩包里
                    try {
                        fis = new FileInputStream(sourceFile);
                    } catch (FileNotFoundException e) {
//                        e.printStackTrace();
                        log.error(e.getMessage());
                    }finally {
                        if (null != fis){
                            fis.close();
                        }
                    }
                    try {
                        bis = new BufferedInputStream(fis, 1024 * 10);
                    } catch (Exception e) {
//                        e.printStackTrace();
                        log.error(e.getMessage());
                    }finally {
                        if (null != bis){
                            bis.close();
                        }
                    }
                    int read = 0;
                    if ( bis != null ){
                        while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                            if ( zos != null ){
                                zos.write(bufs, 0, read);
                            }
                        }
                    }
                    flag = true;
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                // 关闭流
                try {
                    if (null != bis){
                        bis.close();
                    }
                    if (null != zos){
                        zos.close();
                    }
                } catch (IOException e) {
//                    e.printStackTrace();
                    log.error(e.getMessage());
                }
            }
        }
        return flag;
    }

    /**
     * 将流的内容打包成fileName名称的zip文件,并存放到zipFilePath路径下
     * @param streamfilename 待压缩的文件路径
     * @param zipFilePath 压缩后存放路径
     * @param fileName 压缩后文件的名称
     * @return
     */
    public static boolean streamToZip(InputStream fis, String streamfilename, String zipFilePath, String fileName) {
        boolean flag = false;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        try {
            File zipFile = new File(zipFilePath + "/" + fileName + ".zip");
            if (zipFile.exists()) {
                log.info(zipFilePath + "目录下存在名字为:" + fileName + ".zip" + "打包文件.");
                return false;
            } else {
                try {
                    fos = new FileOutputStream(zipFile);
                } catch (FileNotFoundException e) {
//                    e.printStackTrace();
                    log.error(e.getMessage());
                } finally {
                    if (null != fos ){
                        fos.close();
                    }
                }
                try {
                    zos = new ZipOutputStream(new BufferedOutputStream(fos));
                } catch (Exception e) {
//                    e.printStackTrace();
                    log.error(e.getMessage());
                } finally {
                    if (null != zos ){
                        zos.close();
                    }
                }
                byte[] bufs = new byte[1024 * 10];
                // 创建ZIP实体,并添加进压缩包
                ZipEntry zipEntry = new ZipEntry(streamfilename);
                if ( zos != null ){
                    zos.putNextEntry(zipEntry);
                }
                // 读取待压缩的文件并写进压缩包里
                bis = new BufferedInputStream(fis, 1024 * 10);
                int read = 0;
                while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                    if ( zos != null ){
                        zos.write(bufs, 0, read);
                    }
                }
                flag = true;
            }
            if ( zos != null ){
                zos.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            // 关闭流
            try {
                if (null != bis){
                    bis.close();
                }
                if (null != zos){
                    zos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }

    /**
     * 将流转成zip文件输出
     * @param inputstream 文件流
     * @param streamfilename 流文件的名称
     * @param fileName zip包的名称
     * @param response
     * @return
     */
    public static boolean streamToZipStream(InputStream inputstream, String streamfilename, String fileName,
                                            HttpServletResponse response) {
        boolean flag = false;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        OutputStream out = null;
        try {
            out = response.getOutputStream();
            response.reset();
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + new String(fileName.getBytes("GB2312"), "ISO-8859-1"));
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setCharacterEncoding("UTF-8");
            zos = new ZipOutputStream(out);
            byte[] bufs = new byte[1024 * 10];
            // 创建ZIP实体,并添加进压缩包
            ZipEntry zipEntry = new ZipEntry(streamfilename);
            zos.putNextEntry(zipEntry);
            // 读取待压缩的文件并写进压缩包里
            bis = new BufferedInputStream(inputstream, 1024 * 10);
            int read = 0;
            while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                zos.write(bufs, 0, read);
            }
            flag = true;
            zos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            // 关闭流
            try {
                if (null != bis){
                    bis.close();
                }
                if (null != zos){
                    zos.close();
                }
                if (null != out){
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }

    /**
     * 将多个流转成zip文件输出
     * @param listStream 文件流实体类对象
     * @param fileName zip包的名称
     * @param response
     * @return
     */
    public static boolean listStreamToZipStream(List<ZipDto> listStream, String fileName, HttpServletResponse response) {
        boolean flag = false;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        OutputStream out = null;
        try {
            out = response.getOutputStream();
            response.reset();
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + new String(fileName.getBytes("GB2312"), "ISO-8859-1"));
            response.setHeader("Access-Control-Allow-Origin","*");
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setCharacterEncoding("UTF-8");
            zos = new ZipOutputStream(out);
            byte[] bufs = new byte[1024 * 10];
            for (ZipDto zipDto : listStream) {
                String streamfilename = zipDto.getName();
                // 创建ZIP实体,并添加进压缩包
                ZipEntry zipEntry = new ZipEntry(streamfilename);
                zos.putNextEntry(zipEntry);
                // 读取待压缩的文件并写进压缩包里
                bis = new BufferedInputStream(zipDto.getInputstream(), 1024 * 10);
                int read = 0;
                while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                    zos.write(bufs, 0, read);
                }
            }
            flag = true;
            zos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            // 关闭流
            try {
                if (null != bis){
                    bis.close();
                }
                if (null != zos){
                    zos.close();
                }
                if (null != out){
                    out.close();
                }
            } catch (IOException e) {
//                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
        return flag;
    }

}