本文是“Java不生成临时文件的导出下载csv文件的功能实现(1)一文的扩展,所以模拟输入和下载文件的代码同上篇文章。
不同之处在于要设置每个csv的数据量
private static final Integer fileCapacity = 10000;
缓存生成的csv字节数组流的列表
List bytesList = new ArrayList<>();
根据数据总数和单csv数据量大小计算csv字节数组流的个数
List bytesList = new ArrayList<>();
Integer fileCount = dataList.size() / fileCapacity;
for (int i=0; i < fileCount; i++) {
//分组,每个csv文件保存10000条数据,整体打包为一个zip文件
List subList = dataList.subList(i*fileCapacity, (i+1)*fileCapacity);
//生成byte数组
byte[] bytes = this.generateCsvFile(subList, fieldNames, fieldDescs);
bytesList.add(bytes);
//这里不能清除,否则原list中对应的数据也会清除掉
//subList.clear();
}
//最后不足10000的数据
if (fileCount*fileCapacity < dataList.size()) {
List subList = dataList.subList(fileCount*fileCapacity, dataList.size());
//生成byte数组
byte[] bytes = this.generateCsvFile(subList, fieldNames, fieldDescs);
bytesList.add(bytes);
subList.clear();
}
最后把csv字节数组流列表循环放入zip输出流中。
for (int i = 0; i < bytesList.size(); i++) {
try {
String entryName = fileNameStr + (i + 1) + ".csv";
ZipEntry entry = new ZipEntry(entryName);
zos.putNextEntry(entry);
zos.write(bytesList.get(i));
zos.closeEntry();
} catch (Exception e) {
log.error("zip文件生成错误。", e);
}
}
具体有不清楚的,可以去我的github看看。地址:
https://github.com/whol/exportdemo,分支为 分批查询生成多csv文件并打包下载。
最后修改于 2019-04-02 19:59:33
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

