背景
最近在做数据导出的功能,由于要支持批量导出且导出的文件都巨大3GB起,所以决定在导出最终结果时进行压缩
第一天
java压缩,emmm...首先想到的就是java.util.zip下面的各种api,直接上代码:
/**
* 批量压缩文件 v1.0
*
* @param fileNames 需要压缩的文件名称列表(包含相对路径)
* @param zipOutName 压缩后的文件名称
**/
public static void batchZipFiles(List<String> fileNames, String zipOutName) {
//设置读取数据缓存大小
byte[] buffer = new byte[4096];
ZipOutputStream zipOut = null;
try {
zipOut = new ZipOutputStream(new FileOutputStream(zipOutName));
for (String fileName : fileNames) {
File inputFile = new File(fileName);
if (inputFile.exists()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));
//将文件写入zip内,即将文件进行打包
zipOut.putNextEntry(new ZipEntry(inputFile.getName()));
//写入文件的方法,同上
int size = 0;
//设置读取数据缓存大小
while ((size = bis.read(buffer)) >= 0) {
zipOut.write(buffer, 0, size);
}
//关闭输入输出流
zipOut.closeEntry();
bis.close();
}
}
} catch (Exception e) {
log.error("batchZipFiles error:sourceFileNames:" + JSONObject.toJSONString(fileNames), e);
} finally {
if (null != zipOut) {
try {
zipOut.close();
} catch (Exception e) {
log.error("batchZipFiles error:sourceFileNames:" + JSONObject.toJSONString(fileNames), e);
}
}
}
}
复制代码
首先利用BufferedInputStream读取文件内容,ZipOutputStream的putNextEntry方法对每一个文件进行压缩写入。最后将所有压缩后的文件写入到最终的zipOutName文件中。由于用了BufferedInputStream缓冲输入流,文件的读取和写入都是从缓存区(内存)中也就是代码里面对应的byte数组获取,相比较普通的FileInputStream提升了较大的效率。但是不够!耗时如下&#x