从对象列表生成CSV

时间:2016-03-22 18:59:56

标签: java hibernate spring-mvc csv

我正在尝试根据hibernate查询的结果生成CSV,它可能包含多达200k行,并且在创建时,CSV可能大约为30MB。

我正在努力让表演接近可接受的程度。 目前我的hibernate查询将返回一个对象列表。 然后我使用StringBuilder生成CSV字符串。 然后我从中获取一个字节数组,并将字节数组传递给response.outputstream.write()方法。

为了有效地生成这样大小的CSV,我应该怎么做?

我的服务

List<Object> objectList = hibernateDao.getObjectList(objectList);

    StringBuilder sb = new StringBuilder();
    sb.append("field1_id,field2,field3,field14");
    for(Object object : objectList){
        sb.append("\n");
        sb.append(object.field1());
        sb.append(",");
        sb.append(object.field2());
        sb.append(",");
        sb.append(object.field3());
        ...
        ...
        sb.append(",");
        sb.append(object.field14);
    }
    byte[] bytes = sb.toString().getBytes();
    return bytes;

我的控制器将获得结果字节[]

response.setHeader("Content-Type", "text/comma-separated-values");
response.getOutputStream().write(objectService.getListByteArray());

1 个答案:

答案 0 :(得分:0)

问题最初出现在您的StringBuilder扩展中,您可以初始化它以分配大量字符,但是您尝试编写的内容的长度可能超过Integer.MAX_VALUE( <{1}}的最大长度,您将收到缓冲区溢出错误。

还有一个潜在的问题,即在单独编写的值中转义逗号和引用字符。这很难处理,我建议您使用CSV库以确保获得正确的输出。

尝试uniVocity-parsers来保留您的对象。您可以使用一些注释将特定字段序列化为CSV。

免责声明:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)