前言
一些用户需要将服务器上的文件打包成压缩包的方式导出到本地。会存在多个文件压缩至一个包中;
目录
一、ZipOutPutStream
zipoutputStream是fileOutputStream中的一种,它可以将内容直接写入到zip包中。一般创建zipoutputStream通常是封装一个FileOutputStream,然后在每写入一个文件之前,需要先调用一次putNextEntry,然后使用write写入byte[]类型的数据,当写入完毕的时候使用colseEntry来结束这个文件的打包;
二、案例
1.创建压缩包
代码如下:
@GetMapping("/backUp")
public void backUp(HttpServletRequest request,
HttpServletResponse response) {
// 创建输出流以及待下载的文件名称
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-disposition", "attachment;filename=" + ZIPNAME + SUFFIX);
// 创建流对象
try (
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
DataOutputStream os = new DataOutputStream(zipOutputStream);
) {
zipOutputStream.setMethod(ZipOutputStream.DEFLATED);
// 将压缩包中添加待下载文件
pushDoc(zipOutputStream, os);
// 刷新流
os.flush();
os.close();
} catch (Exception e) {
log.error("backUp {}", e);
e.printStackTrace();
}
}
2.写入数据
代码如下:
private void writeTPrMeeting(ZipOutputStream zipOutputStream,
DataOutputStream os,
String jsonString, String docName, String suffix) {
File file = null;
// 压缩包待生成文件
String zipPath = docName + suffix;
// 临时文件
String tempPath = docName + TEMP + suffix;
try {
// 在压缩包下创建文件
zipOutputStream.putNextEntry(new ZipEntry(zipPath));
BufferedWriter bw;
// 生成临时文件
bw = new BufferedWriter(new FileWriter(tempPath));
bw.write(jsonString);
bw.close();
file = new File(tempPath);
FileInputStream fis = null;
fis = new FileInputStream(file);
int len;
byte[] b = new byte[1024];
// 在刚刚创建文件中写入数据
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (file != null && file.exists()) {
file.delete();
}
}
}