如何使用 Apache Common CSV CSVPrinter 添加新行?

key*_*ger 2 java apache-commons-csv

我有一个包含使用Apache Common CSV library 1.5生成 CSV 文件的方法的类

public class CSVGenerator {

    private static final String CSV_FILE = "./credentials.csv";
    private static CSVPrinter csvPrinter;

    public static void generateCSV(String FirstName, String LastName, String DOB) {


        try {
            BufferedWriter writer = Files.newBufferedWriter(Paths.get(CSV_FILE) );

            csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT
                    .withHeader("FirstName", "LastName", "DOB"));

            csvPrinter.printRecord(FirstName, LastName, DOB);
            csvPrinter.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的主类中有一个方法,这个方法会调用该方法generateCSV()几次。
如何写入新行并将其附加到现有 CSV 文件中?使用我当前的实现,它将继续覆盖我的第一行。

更直接的解决方案是在任何 Java 集合(数组或列表)中收集我的所有数据,然后在最后迭代集合并将其一次性写入 CSV。但我不会走那条路。我更喜欢将一行写入 CSV ,做其他事情,然后再次调用该方法以写入新行并将其附加到现有的 CSV 中。

谢谢。

Jim*_*son 7

使用APPEND选项:

BufferedWriter writer = Files.newBufferedWriter(
        Paths.get(CSV_FILE), 
        StandardOpenOption.APPEND, 
        StandardOpenOption.CREATE);
Run Code Online (Sandbox Code Playgroud)

你必须处理事情,这样一个下面的是真实的:

  1. 在开始之前,请确保输出文件为空或不存在;或者
  2. APPEND仅在第二次和后续调用中使用该选项generateCSV

顺便说一句,您正在创建一个新的BufferedWriterCSVPrinter每次调用generateCSV,而不是关闭任何一个。这很浪费,您可能应该在构造函数中创建它们,实现Closeable,并实现一个close()方法来清理。然后将调用代码包装在实例化的 try-with-resources 中generateCSV