Java写入CSV文件异常:仅保留最后输入且无法添加表头
问题解决:Java CSV写入覆盖数据与表头添加问题
问题根源
- 数据被覆盖:
FileOutputStream默认以覆盖模式打开文件,每次调用writeToFile都会清空原有内容,只写入当前数据,导致之前的输入全部丢失。 - 表头重复/无法添加:如果直接在
writeToFile里写表头,每次写入都会重复添加表头;注释掉表头又无法在文件顶部生成唯一的表头。
解决方案
核心修改点
- 使用
FileOutputStream的追加模式:构造方法传入第二个参数true,实现内容追加而非覆盖。 - 仅在文件首次创建时写入表头:通过检查文件是否存在,决定是否写入表头,避免重复添加。
修改后的完整代码
import java.util.*; import java.io.*; public class programOneTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String choice; String fileName = "storage.csv"; // 初始化文件,首次创建时写入表头 initFile(fileName); do { String name = getName(sc); double time = getTime(sc); writeToFile(fileName, name, time); System.out.println("Would you like to enter more data? (Y/N)"); choice = sc.nextLine(); } while ("y".equalsIgnoreCase(choice)); } // 初始化文件:仅当文件不存在时写入表头 private static void initFile(String fileName) { File file = new File(fileName); if (!file.exists()) { try (PrintWriter pw = new PrintWriter(new FileOutputStream(file))) { pw.println("Name, Time"); } catch (IOException e) { System.out.println("Error initializing file: " + e.getMessage()); } } } private static String getName(Scanner sc) { String name; do { System.out.println("Name:"); name = sc.nextLine(); if (name.isEmpty()) { System.out.println("Error. Please enter a name."); } } while (name.isEmpty()); return name; } private static double getTime(Scanner sc) { double time = -1.0; do { System.out.println("Time:"); time = sc.nextDouble(); sc.nextLine(); if (time > 0) { break; } else { System.out.println("Error. Please enter an appropriate time."); } } while (time < 0); return time; } // 追加模式写入数据 private static void writeToFile(String pFileName, String pName, double pTime) { try (PrintWriter pw = new PrintWriter(new FileOutputStream(pFileName, true))) { pw.println(pName + ", " + pTime); } catch(IOException e) { System.out.println("Error in writing to file: " + e.getMessage()); } } }
修改说明
- 新增
initFile方法:程序启动时检查文件是否存在,不存在则创建并写入表头,确保表头只出现一次。 - 修改
writeToFile方法:使用FileOutputStream(pFileName, true)开启追加模式,每次写入数据都会添加到文件末尾,不会覆盖原有内容。 - 资源自动管理:使用try-with-resources语法,无需手动关闭流,避免资源泄漏。
验证结果
运行程序输入数据后,storage.csv内容将符合预期:
Name, Time John, 6 Van, 4
内容的提问来源于stack exchange,提问作者natadecoco
相关产品推荐
相关产品推荐

