使用OpenCSV,如何使用MappingStrategy附加到现有CSV?我可以找到很多不使用Bean映射策略的例子但是我喜欢使用bean策略的列映射的动态特性,并希望以这种方式工作。这是我的代码,它只是将单行重写为CSV文件而不是附加。
我怎样才能解决这个问题?使用OpenCSV 4.5。注意:我将fileWriter设置为append = true。此方案无法按预期工作。重新运行此方法只会导致使用标题和单行覆盖整个文件。
public void addRowToCSV(PerfMetric rowData) {
File file = new File(PerfTestMetric.CSV_FILE_PATH);
try {
CSVWriter writer = new CSVWriter(new FileWriter(file, true));
CustomCSVMappingStrategy<PerfMetric> mappingStrategy
= new CustomCSVMappingStrategy<>();
mappingStrategy.setType(PerfMetric.class);
StatefulBeanToCsv<PerfMetric> beanToCsv
= new StatefulBeanToCsvBuilder<PerfMetric>(writer)
.withMappingStrategy(mappingStrategy)
.withSeparator(',')
.withApplyQuotesToAll(false)
.build();
try {
beanToCsv.write(rowData);
} catch (CsvDataTypeMismatchException e) {
e.printStackTrace();
} catch (CsvRequiredFieldEmptyException e) {
e.printStackTrace();
}
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
或者,是将所有行加载到List然后重写整个文件的常用模式?我能够通过编写两个MappingStrategy映射策略然后有条件地使用if-file-exists来使它工作,但这样做会让我在代码中留下“未经检查的赋值”警告。不理想;希望有一个优雅的解决方案?
我从来没有找到这个问题的答案,所以我最终做的是做一个分支if条件,其中存在.csv文件。如果文件存在,我使用MappingStrategyWithoutHeader策略,如果文件尚不存在,我使用MappingStrategyWithHeader策略。不理想,但我得到了它的工作。