java - 从对象列表生成 CSV

标签 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;

我的 Controller 将获取结果字节[]

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

最佳答案

问题最初似乎出在您的 StringBuilder 扩展上,您可以将其初始化以分配大量字符,但随后您尝试写入的内容的长度可能会超过 Integer.MAX_VALUE(char[] 的最大长度),并且您将收到缓冲区溢出错误。

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

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

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

关于java - 从对象列表生成 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36162979/

相关文章:

java - 查询语法异常 : unexpected token:

java - 使用 HQL 从它们之间具有一对多关系的连接表中进行选择

java - 没有新实体的一对多关系

spring - 在 Spring MVC 中定义 MessageSource 和 LocaleResolver bean 以添加 i18n 支持

spring - Spring MVC 中的数组 @ModelAttribute 扩展

java - ArrayLists重复元素合并

java - 什么是 uber JAR 文件?

java - 使用 Solr CELL 的 ExtractingRequestHandler 从包格式中索引/提取文件

spring-mvc - 获取mybatis中插入记录的自动生成的key

javascript - 如何将下面的 hashMap<String, String> 转换为可用的 JS 对象?