我正在尝试根据 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/