Java使用FileWriter向CSV文件写入指定行并添加表头的实现咨询
代码调整实现方案
你原来的代码存在两个核心问题:
- 默认使用覆盖模式写入文件,每次调用方法都会清空历史数据
- 没有表头写入逻辑,也没有判断文件是否首次创建的机制
调整后的完整代码如下:
private void saveStats(int early, int infected, int recovered, int deads, int notInfected, int vaccinated, int iteration){ // 定义文件对象 File statFile = new File("statistic.csv"); // 判断是否需要写入表头:文件不存在 或 文件存在但内容为空时写入表头 boolean needWriteHeader = !statFile.exists() || statFile.length() == 0; // try-with-resources自动关闭流,第二个参数true代表开启追加写入模式 try (FileWriter txt = new FileWriter(statFile, true)) { if (needWriteHeader) { // 表头和数据行统一使用分号作为分隔符 txt.write("Iteration;Early;Infected;Recovered;Dead;NotInfected;Vaccinated\n"); } // 按顺序写入字段值 txt.write(String.valueOf(iteration)); txt.write(";"); txt.write(String.valueOf(early)); txt.write(";"); txt.write(String.valueOf(infected)); txt.write(";"); txt.write(String.valueOf(recovered)); txt.write(";"); txt.write(String.valueOf(deads)); txt.write(";"); txt.write(String.valueOf(notInfected)); txt.write(";"); txt.write(String.valueOf(vaccinated)); txt.write("\n"); } catch (IOException ex) { ex.printStackTrace(); System.out.println("Error!"); } }
核心修改点说明
- 新增文件存在性判断逻辑,仅在首次创建文件/文件为空时写入表头,避免重复写入表头
- FileWriter构造方法新增第二个参数
true,开启追加写入模式,不会覆盖原有历史数据 - 改用try-with-resources语法自动管理流的关闭,避免手动关闭流时可能出现的资源泄漏问题
- 补充迭代次数字段的写入逻辑,和列名规则对应
- 表头和数据行统一使用分号作为分隔符,保证CSV文件格式一致
内容的提问来源于stack exchange,提问作者Sebastian Halik
相关产品推荐
相关产品推荐

