如何通过Jackson CsvMapper收集流式写入后的完整内容?
搞定Jackson CSV流式生成后收集完整内容的小技巧
哈哈,这个场景我之前做数据导出的时候也踩过坑!你之前用JsonGenerator流式生成JSON能最后读取完整内容,用Jackson CSV库其实完全可以复刻这个逻辑——核心就是用内存输出流来承接所有写入的CSV内容,最后一次性提取出来就行。
具体怎么写?看代码:
先搞个
ByteArrayOutputStream当临时容器,专门存生成的CSV内容:ByteArrayOutputStream baos = new ByteArrayOutputStream();把这个输出流和你的
ObjectWriter绑定,然后批量写入你的item:CsvMapper csvMapper = new CsvMapper(); // 你的schema配置,保持你原来的设置就行 CsvSchema schema = CsvSchema.builder().setUseHeader(true).build(); ObjectWriter writer = csvMapper.writer(schema); items.forEachRemaining(item -> { try { // 把每个item写入到内存输出流里 writer.writeValue(baos, item); } catch (IOException e) { // 这里可以根据你的业务处理异常,比如转成运行时异常抛出去 throw new RuntimeException("生成CSV行失败", e); } });最后从内存流里把完整的CSV内容捞出来就行:
// 转成UTF-8编码的字符串返回,避免乱码 String fullCsvContent = baos.toString(StandardCharsets.UTF_8); // 要是需要字节数组的话直接用baos.toByteArray()就行 return fullCsvContent;
为啥这方法管用?
Jackson的ObjectWriter本身就支持写入到任意OutputStream,ByteArrayOutputStream就是在内存里开辟的一块空间,流式写入的每一行CSV都会被存在这里。等所有item都写完,内存流里就存了完整的CSV内容,和你之前用JsonGenerator的逻辑完全一致——既保留了流式处理的高效性,又能最后拿到完整结果。
提个醒:
- 别忘了处理
IOException,因为writeValue会抛检查型异常,直接转成运行时异常或者统一捕获处理都可以。 - 转字符串的时候一定要指定编码(比如上面的
StandardCharsets.UTF_8),别依赖系统默认编码,不然很容易出现乱码问题。
内容的提问来源于stack exchange,提问作者czr_RR
相关产品推荐
相关产品推荐

