利用commons-csv库,java8写一个方法:将List<ADto>出力到csv文件中,参数为List<ADto>、ADto.class、filePath。要求大数据量的情况下提高性能
时间: 2024-01-21 19:18:33 浏览: 21
可以使用Java 8的Stream API和commons-csv库实现将List<ADto>写入CSV文件的方法,具体代码如下:
```java
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
public class CsvWriter {
public static <T> void writeListToCsv(List<T> list, Class<T> clazz, String filePath) throws IOException {
// 获取类的所有字段
Field[] fields = clazz.getDeclaredFields();
// 定义CSV格式
CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(getHeaders(fields)).withRecordSeparator("\n");
// 创建CSVPrinter对象
try (CSVPrinter csvPrinter = new CSVPrinter(new FileWriter(filePath), csvFormat)) {
// 写入数据
list.stream().forEach(item -> {
try {
csvPrinter.printRecord(getFieldValues(item, fields));
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
// 获取所有字段的名字
private static String[] getHeaders(Field[] fields) {
String[] headers = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
headers[i] = fields[i].getName();
}
return headers;
}
// 获取指定对象的所有字段值
private static Object[] getFieldValues(Object obj, Field[] fields) {
Object[] fieldValues = new Object[fields.length];
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
try {
fieldValues[i] = fields[i].get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return fieldValues;
}
}
```
使用方法:
```java
List<ADto> list = new ArrayList<>(); // 假设已经初始化了数据
String filePath = "path/to/csv/file.csv";
CsvWriter.writeListToCsv(list, ADto.class, filePath);
```
该方法使用了Stream API来遍历List,使用CSVPrinter将数据写入CSV文件。同时,为了提高性能,使用了try-with-resources语句自动关闭CSVPrinter对象。在获取对象的字段值时,使用了反射技术来获取所有字段的值。