java8实现:写一个大数据量出力到csv的共通方法,参数为List<ADto>、ADto.class、filePath,将list出力到csv文件中
时间: 2023-12-14 09:39:17 浏览: 36
可以使用Java8中的流式API来实现大数据量写入CSV文件的共通方法。以下是一个示例代码:
```java
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import java.util.stream.Collectors;
public class CsvWriter {
public static <T> void write(List<T> list, Class<T> clazz, String filePath) throws IOException {
// 获取所有字段名
List<String> fieldNames = getFieldNames(clazz);
// 将每个对象转换为CSV行
List<String> csvRows = list.stream()
.map(obj -> toCsvRow(obj, fieldNames))
.collect(Collectors.toList());
// 将CSV行写入文件
try (FileWriter writer = new FileWriter(filePath)) {
for (String row : csvRows) {
writer.write(row);
writer.write(System.lineSeparator()); // 换行符
}
}
}
private static <T> List<String> getFieldNames(Class<T> clazz) {
return List.of(clazz.getDeclaredFields())
.stream()
.map(Field::getName)
.collect(Collectors.toList());
}
private static <T> String toCsvRow(T obj, List<String> fieldNames) {
return fieldNames.stream()
.map(fieldName -> getField(obj, fieldName))
.collect(Collectors.joining(","));
}
private static <T> String getField(T obj, String fieldName) {
try {
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(obj);
return String.valueOf(value);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
```
使用示例:
```java
List<ADto> list = ...; // 初始化数据列表
CsvWriter.write(list, ADto.class, "output.csv");
```
其中,`ADto`是要输出的对象类型,需要保证其字段能够正确地转换为CSV格式。如果某个字段的类型无法转换为字符串,可以在`getField`方法中添加特殊处理逻辑。