关于使用Java进行文件压缩

1,实际生产环境中,我们往往不单单是使用文件流进行导入和导出,比如一些数据量多的情况下,光导入出来会出现一些效率低下的问题;这时候文件进行压缩就可以解决这个问题。

2,首先我们把具体的方法封装成一个工具类

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtils {public static void doCompress(String srcFile, String zipFile) throws IOException {
        doCompress(new File(srcFile), new File(zipFile));
    }
    
    /**
     * 文件压缩
     * @param srcFile 目录或者单个文件
     * @param zipFile 压缩后的ZIP文件
     */
    public static void doCompress(File srcFile, File zipFile) throws IOException {
        ZipOutputStream out = null;
        try {
            out = new ZipOutputStream(new FileOutputStream(zipFile));
            doCompress(srcFile, out);
        } catch (Exception e) {
            throw e;
        } finally {
            out.close();//记得关闭资源
        }
    }
    
    public static void doCompress(String filelName, ZipOutputStream out) throws IOException{
        doCompress(new File(filelName), out);
    }
    
    public static void doCompress(File file, ZipOutputStream out) throws IOException{
        doCompress(file, out, "");
    }
public static void doCompress(File inFile, ZipOutputStream out, String dir) throws IOException { if ( inFile.isDirectory() ) { File[] files = inFile.listFiles(); if (files!=null && files.length>0) { for (File file : files) { String name = inFile.getName(); if (!"".equals(dir)) { name = dir + "/" + name; } ZipUtils.doCompress(file, out, name); } } } else { ZipUtils.doZip(inFile, out, dir); } }
    
public static void doZip(File inFile, ZipOutputStream out, String dir) throws IOException { 
  String entryName
= null;
  if (!"".equals(dir)) {
     entryName
= dir + "/" + inFile.getName();
  }
else {
  entryName
= inFile.getName();
  }
  ZipEntry entry
= new ZipEntry(entryName);
  out.putNextEntry(entry);

  int len = 0 ;

  byte[] buffer = new byte[1024];
  FileInputStream fis
= new FileInputStream(inFile);

  while ((len = fis.read(buffer)) > 0) {
  out.write(buffer,
0, len);
  out.flush();
  }
  out.closeEntry();
  fis.close();
  }

}

 3,我们在具体的业务处理上调用此方法(具体的业务操作方法具体实际进行修改)

 

@RequestMapping("/doExportMbti")
    public void doExportMbti(HttpServletRequest request,HttpServletResponse response) throws Exception {
        String errorMsg = "";
        String lotNumberId = request.getParameter("lotNumberId");

        SurveyRecordMbtiQueryDTO lotQuery = new SurveyRecordMbtiQueryDTO();
        lotQuery.setId(lotNumberId);
        SurveyRecordMbtiResultDTO resultDto = mbtiService.doFindLotNumber(lotQuery);
        // zip filepath
        List<String> zipFilePath = new ArrayList<String>();
        if (resultDto != null) {
            String filePath = global.getValue("export.mbti.filePath");
            String lotNumber = resultDto.getLotNumber();
            String times = CommonUtil.dateFormat(new Date(), "yyyyMMddHHmmss");

            File file = new File(filePath);
            // 如果文件夹不存在则创建
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }

            file = new File(filePath + "//" + lotNumber);
            // 如果文件夹不存在则创建
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }

            file = new File(filePath + "//" + lotNumber + "//" + times);
            // 如果文件夹不存在则创建
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }

            SurveyResultJsonMbtiQueryDTO condition = new SurveyResultJsonMbtiQueryDTO();
            condition.setLotNumberId(lotNumberId);
            List<SurveyResultJsonMbtiResultQueryDTO> resultLst = mbtiService.doQuery(condition);
            for (SurveyResultJsonMbtiResultQueryDTO dto : resultLst) {
                String mbtiCode = orderBy(dto);
                String oldFile = global.getValue("export.mbti.model.path")+ "MBTI_" + mbtiCode + ".pdf";
                String newFile = filePath + "//" + lotNumber + "//" + times+ "//MBTI_" + dto.getUserName() + "_" + mbtiCode+ ".pdf";
                // 复制文档
                copyFile(errorMsg, dto.getUserName(), oldFile, newFile);
                zipFilePath.add(newFile);
            }
        }
        // zip 下载
        String zipName = ("mbti报表.zip");
        zipName = URLEncoder.encode(zipName, "UTF-8");
        response.setContentType("APPLICATION/OCTET-STREAM");
        response.setHeader("Content-Disposition", "attachment; filename="+ zipName);
        ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
        try {
            // 多文件打包
            for (int i = 0; i < zipFilePath.size(); i++) {
                ZipUtils.doCompress(zipFilePath.get(i), out);
            }
            response.flushBuffer();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.close();
        }
    }

 

posted @ 2022-04-26 17:33  fu!!!  阅读(1581)  评论(0)    收藏  举报