使用jackson-dataformat-csv写入CSV文件如何去除末尾空行
解决方案
问题原因
末尾空行是Jackson CSV的默认写入逻辑导致:你通过withLineSeparator设置的行分隔符,会在每一条记录(包含表头、最后一条数据行)的末尾都自动追加,最终文件末尾就会多出来一个换行符,打开时显示为空行。
解决方法
方法1:官方配置关闭末尾换行(推荐,适用于jackson-dataformat-csv 2.10及以上版本)
Jackson 2.10版本新增了CsvGenerator.Feature.WRITE_TRAILING_LINE_END配置项,默认开启,关闭后就不会在最后一行末尾追加行分隔符,修改后的代码如下:
public static void writeAccountToFile(List<Map<String, Object>> list, String filePath) { System.out.println("Write data to csv file start"); Writer writer = null; try { File file = new File(filePath); writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); CsvSchema schema = null; CsvSchema.Builder schemaBuilder = CsvSchema.builder(); if (list != null && !list.isEmpty()) { for (String col : list.get(0).keySet()) { schemaBuilder.addColumn(col); } } else { schemaBuilder.addColumn("test1"); schemaBuilder.addColumn("test2"); } schema = schemaBuilder.build().withLineSeparator("\r").withHeader(); CsvMapper mapper = new CsvMapper(); mapper.configure(CsvGenerator.Feature.STRICT_CHECK_FOR_QUOTING, true); // 新增配置:关闭最后一行末尾的换行符写入 mapper.configure(CsvGenerator.Feature.WRITE_TRAILING_LINE_END, false); mapper.writer(schema).writeValues(writer).writeAll(list); writer.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } }
方法2:低版本兼容方案
如果你使用的Jackson版本低于2.10,无法使用上述配置,可以在写入完成后,手动截断文件末尾的行分隔符,补充逻辑如下:
// 原有writeAll执行、flush完成后,添加以下代码 writer.close(); String lineSeparator = "\r"; RandomAccessFile raf = new RandomAccessFile(file, "rw"); // 仅当文件长度大于分隔符长度时才截断 if(raf.length() > lineSeparator.length()) { raf.setLength(raf.length() - lineSeparator.length()); } raf.close();
内容的提问来源于stack exchange,提问作者Hanh Nguyen
相关产品推荐
相关产品推荐

