You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java写入CSV文件异常:仅保留最后输入且无法添加表头

问题解决:Java CSV写入覆盖数据与表头添加问题

问题根源

  1. 数据被覆盖:FileOutputStream默认以覆盖模式打开文件,每次调用writeToFile都会清空原有内容,只写入当前数据,导致之前的输入全部丢失。
  2. 表头重复/无法添加:如果直接在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());
        }
    }
}

修改说明

  1. 新增initFile方法:程序启动时检查文件是否存在,不存在则创建并写入表头,确保表头只出现一次。
  2. 修改writeToFile方法:使用FileOutputStream(pFileName, true)开启追加模式,每次写入数据都会添加到文件末尾,不会覆盖原有内容。
  3. 资源自动管理:使用try-with-resources语法,无需手动关闭流,避免资源泄漏。

验证结果

运行程序输入数据后,storage.csv内容将符合预期:

Name, Time
John, 6
Van, 4

内容的提问来源于stack exchange,提问作者natadecoco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:52:25