java8实现:写一个方法,参数为List<ADto>、ADto.class、filepat,h将List<ADto>出力为csv文件,自动将ADto的字段名出力为表头
时间: 2023-12-10 11:37:42 浏览: 155
java导出csv方法实现讲解
可以使用Java 8的Stream API和Java IO库来实现这个方法。具体实现如下:
```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文件
try (FileWriter writer = new FileWriter(filepath)) {
writer.append(String.join(",", fieldNames)).append("\n");
// 将列表中每个对象的字段值写入csv文件
for (T item : list) {
List<String> fieldValues = getFieldValues(item, fieldNames);
writer.append(String.join(",", fieldValues)).append("\n");
}
}
}
// 获取类的所有字段名
private static <T> List<String> getFieldNames(Class<T> clazz) {
return Stream.of(clazz.getDeclaredFields())
.map(Field::getName)
.collect(Collectors.toList());
}
// 获取对象的所有字段值
private static <T> List<String> getFieldValues(T item, List<String> fieldNames) {
return fieldNames.stream()
.map(fieldName -> {
try {
// 使用反射获取对象的字段值
Field field = item.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object fieldValue = field.get(item);
return String.valueOf(fieldValue);
} catch (NoSuchFieldException | IllegalAccessException e) {
// 如果获取字段值失败,返回空字符串
return "";
}
})
.collect(Collectors.toList());
}
}
```
使用示例:
```java
List<ADto> list = // 从数据库或其他数据源中获取ADto列表
CsvWriter.write(list, ADto.class, "output.csv");
```
这个方法将会将`list`中的`ADto`对象的所有字段值写入`output.csv`文件,第一行为表头,每个字段值之间用逗号分隔。如果获取字段值失败,则在csv文件中写入空字符串。
阅读全文