关于使用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();
}
}

浙公网安备 33010602011771号