如何使用OpenCSV向输出流写入CSV内容?输出流为空如何修复?
问题修复方案
错误原因
- 逻辑错误:你最后创建的
ByteArrayOutputStream是全新的空对象,没有写入任何数据就调用writeTo方法,自然输出为空 - 流操作不规范:
CSVWriter、OutputStreamWriter属于带缓冲的字符流,调用writeNext之后没有手动刷缓冲,也没有正确关闭资源,写入的行数据会留在缓冲里不会落盘/输出到目标流 - 流指向逻辑错误:你的代码目标如果是要获取最终CSV的字节输出流,现在的逻辑是把内容全部写到了
FileOutputStream对应的本地文件里,和ByteArrayOutputStream没有关联
修复方案
分两种常用场景适配:
场景1:既要生成本地CSV文件,也要获取对应的字节数组输出流
@Value("classpath:tpls/Non-PnL_Template_Export_Order_Cross_Checking.csv") private org.springframework.core.io.Resource exportFileOrderTpl; // 核心处理逻辑 try (InputStream inputStream = exportFileOrderTpl.getInputStream(); // 统一用ByteArrayOutputStream接收所有内容(模板+自定义行) ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); CSVWriter writer = new CSVWriter(outputStreamWriter)) { // 先复制模板内容到字节输出流 IOUtils.copy(inputStream, outputStream); // 追加写入自定义行 String[] rows = {"1","2","3"}; writer.writeNext(rows); // 手动刷缓冲,确保所有内容写入outputStream writer.flush(); // 如需生成本地文件,再把outputStream的内容写入本地文件 String outputFileName = "file.csv"; try (FileOutputStream fileOutputStream = new FileOutputStream(outputFileName)) { outputStream.writeTo(fileOutputStream); } // 这里的outputStream已经包含完整的CSV内容,可直接使用 byte[] csvBytes = outputStream.toByteArray(); } catch (IOException e) { // 自定义异常处理逻辑 e.printStackTrace(); }
场景2:不需要生成本地文件,只需要获取CSV字节流用于导出/接口返回
直接删除上面代码中FileOutputStream相关的本地文件写入逻辑即可,所有内容会直接写入ByteArrayOutputStream。
注意:优先使用try-with-resources语法自动管理流的关闭,既可以避免资源泄漏,也能让缓冲流在关闭时自动刷缓冲,不需要手动调用flush
内容的提问来源于stack exchange,提问作者Loint
相关产品推荐
相关产品推荐

