批量压缩zip文件

原创 2018年04月17日 10:19:34
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

import com.infoservice.mvc.context.ActionContext;
import com.svw.domssk.actions.hicrecord.HicRecordAction;

/**
 * <p>
 * ClassName: ZipFileUtil
 * </p>
 * <p>
 * Description: TODO
 * </p>
 * <p>
 * Author: yfc
 * </p>
 * <p>
 * Date: 2018-2-1
 * </p>
 */
public class ZipFileUtil {
    /**
     * <p>
     * Field k:定义递归次数变量
     * </p>
     */
    static int k = 1;
    /**
     * <p>
     * Field logger: TODO
     * </p>
     */
    private static Logger logger = Logger.getLogger(HicRecordAction.class);

    /**
     * <p>
     * Description: 压缩
     * </p>
     * 
     * @param zipFileName ZIP文件名包含全路径
     * @param fileName 压缩的文件名
     * @param delpath 根目录
     * @param files 压缩的文件
     */
    public static void getDownload(String zipFileName, String fileName, String delpath, File... files) {
        ActionContext act = ActionContext.getContext();
        HttpServletResponse response = act.getResponse().getHttpResponse();
        try {
            //获取压缩后的文件
            ZipFileUtil.zip(zipFileName, files);
            //下载压缩后的文件
            DownloadUtil.downloadFile(fileName, new File(zipFileName), response);
            logger.info("下载完成-----删除临时文件");
            ZipFileUtil.delFolder(delpath);
            ZipFileUtil.delFolder(zipFileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * <p>
     * Description: 压缩指定的单个或多个文件,如果是目录,则遍历目录下所有文件进行压缩
     * </p>
     * 
     * @param zipFileName ZIP文件名包含全路径
     * @param files 压缩的文件
     * @return null
     */
    public static HttpServletResponse zip(String zipFileName, File... files) {
        logger.info("压缩: " + zipFileName);
        ZipOutputStream out = null;
        try {
            createDir(zipFileName);
            out = new ZipOutputStream(new FileOutputStream(zipFileName));
            out.setEncoding("gbk");
            for (int i = 0; i < files.length; i++) {
                if (null != files[i]) {
                    zip(out, files[i], files[i].getName());
                }
            }
            out.close(); // 输出流关闭
            logger.info("压缩完成-----下载临时文件");
            return null;
        } catch (Exception e) {
            logger.error(e.getMessage());
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 执行压缩
     * 
     * @param out ZIP输入流new File("D:\\skoda_doms\\temp"
     * @param f 被压缩的文件
     * @param base 被压缩的文件名
     */
    private static void zip(ZipOutputStream out, File f, String base) { // 方法重载
        try {
            if (f.isDirectory()) { //压缩目录
                try {
                    File[] fl = f.listFiles();
                    if (fl.length == 0) {
                        out.putNextEntry(new ZipEntry(base + "/")); // 创建zip实体
                        logger.info(base + "/");
                    }
                    for (int i = 0; i < fl.length; i++) {
                        zip(out, fl[i], base + "/" + fl[i].getName()); // 递归遍历子文件夹
                    }
                    k++;
                } catch (IOException e) {
                    logger.error(e.getMessage());
                    e.printStackTrace();
                }
            } else { //压缩单个文件
                logger.info(base);
                out.putNextEntry(new ZipEntry(base)); // 创建zip实体
                FileInputStream in = new FileInputStream(f);
                BufferedInputStream bi = new BufferedInputStream(in);
                int b;
                while ((b = bi.read()) != -1) {
                    out.write(b); // 将字节流写入当前zip目录
                }
                out.closeEntry(); //关闭zip实体
                in.close(); // 输入流关闭
            }

        } catch (IOException e) {
            logger.error(e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 目录不存在时,先创建目录
     * 
     * @param zipFileName 压缩后的文件名
     */
    private static void createDir(String zipFileName) {
        String filePath = StringUtils.substringBeforeLast(zipFileName, "/");
        File targetFile = new File(filePath);
        if (!targetFile.exists()) { //目录不存在时,先创建目录
            targetFile.mkdirs();
        }
    }

    /**
     * <p>
     * Description: TODO
     * </p>
     * 
     * @param file 需要打包的文件
     * @param response 响应
     * @return response
     */
    public static HttpServletResponse downloadZip(File file, HttpServletResponse response) {
        //以流的形式下载文件
        try {
            InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();

            //清空response
            response.reset();

            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");

            //如果输出的中文名的文件,此处要用URLEncoder.encode方法进行处理
            response.setHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.encode(SysUtil.filterHeather(file.getName()), "UTF-8"));
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            File f = new File(file.getPath());
            f.delete();
        }
        return response;
    }

    /***
     * 删除指定文件夹下所有文件
     * 
     * @param path 文件夹完整绝对路径
     * @return 文件
     */
    public static boolean delAllFile(String path) {
        boolean flag = false;
        File file = new File(path);
        if (!file.exists()) {
            return flag;
        }
        if (!file.isDirectory()) {
            return flag;
        }
        String[] tempList = file.list();
        File temp = null;
        for (int i = 0; i < tempList.length; i++) {
            if (path.endsWith(File.separator)) {
                temp = new File(path + tempList[i]);
            } else {
                temp = new File(path + File.separator + tempList[i]);
            }
            if (temp.isFile()) {
                temp.delete();
            }
            if (temp.isDirectory()) {
                // 先删除文件夹里面的文件  
                delAllFile(path + "/" + tempList[i]);
                // 再删除空文件夹  
                delFolder(path + "/" + tempList[i]);
                flag = true;
            }
        }
        return flag;
    }

    /***
     * 删除文件夹
     * 
     * @param folderPath 文件夹完整绝对路径
     */
    public static void delFolder(String folderPath) {
        try {
            delAllFile(folderPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

shell实例浅谈之十二批量解压zip文件

一、问题       解压很多相似zip文件中的部分文件。 二、详解 (1)判断参数 判断参数是否为空: if [ -z "$1" ];then echo "please input p...
  • taiyang1987912
  • taiyang1987912
  • 2014-11-25 18:56:32
  • 5442

linux大文件分包压缩和批量解压命令tar

linux大文件分包压缩用tar打包命令和split分割命令,批量解压命令用cat和tar
  • a5nan
  • a5nan
  • 2016-04-28 16:42:07
  • 1789

在ASP.NET中实现压缩多个文件为.zip文件,实现批量下载功能

使用ICSharpCode.SharpZipLib.dll;  下载地址   http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.as...
  • ysq5202121
  • ysq5202121
  • 2012-07-27 10:46:14
  • 1427

Java使用Ant批量把文件打成ZIP压缩包

  • 2015年06月05日 14:31
  • 932KB
  • 下载

使用7zip批量压缩文件夹到不同压缩包

for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" 保存为BAT,放在需要压缩文件夹的目录,请不要使用管理员权...
  • powmxypow
  • powmxypow
  • 2016-07-11 10:15:07
  • 1961

Linux下批量解压多个zip文件的方法

一、首先安装$sudo urpmi unzip unrar二、 进入到所在文件夹,然后有如下几种方法可用 法一:用分号或者&&隔开(适用于对象较少的时候)unzip a.zip && unzi...
  • crazycui
  • crazycui
  • 2016-08-18 11:26:25
  • 4995

多个excel导出压缩成zip 文件 数据量大导出

  • 2017年02月23日 14:52
  • 37.01MB
  • 下载

springmvc批量将文件打包成zip下载

springMVC的代码  /**   * 一键下载图片   */  @SuppressWarnings("unchecked")  @RequestMapping(value = "dow...
  • u011473036
  • u011473036
  • 2016-12-26 15:28:56
  • 1165

用Shell命令批量压缩指定目录下指定目录到目标目录中

#!/bin/bash function usage(){     echo ""     echo "introduction: tar of source dir start with pa...
  • springseazhao
  • springseazhao
  • 2016-06-04 16:12:44
  • 662

java实现word下载及打包成zip下载(单个文件、多个文件)

word文档批量下载(单个、多个)以zip形式下载
  • qq_36765085
  • qq_36765085
  • 2017-12-07 14:56:05
  • 335
收藏助手
不良信息举报
您举报文章:批量压缩zip文件
举报原因:
原因补充:

(最多只允许输入30个字)