本文是“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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇