public void exportData(String taskId, List<String> fileNameList) throws Exception {
log.info("获取所有实体字段,实体不用加注解,取默认实体字段,可自行加自定义实体注解");
Field[] declaredFields = DaTrsSeg.class.getDeclaredFields();
List<String> filedNames = Arrays.stream(declaredFields).map(Field::getName).collect(Collectors.toList());
/**
* columnNames 实体字段名
*/
List<String> columnNames = new ArrayList<>();
for (String filedName : filedNames) {
columnNames.add(humpToLine(filedName));
}
BufferedReader bufferedReader = null;
try {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("文件地址"), StandardCharsets.UTF_8);
bufferedReader = new BufferedReader(inputStreamReader);
String titleStr = bufferedReader.readLine();
/**
* titleList 获取文件中所有字段
*/
List<String> titleList = Arrays.stream(titleStr.split("文件分隔符")).collect(Collectors.toList());
/**
* filedTarget 获取实体和文件字段 索引对应关系
*/
Map<Integer, Integer> filedTarget = getFiledTargetMap(columnNames, titleList);
List<DaTrsSeg> daTrsSegList = new ArrayList<>();
String line;
while (StringUtils.isNotEmpty(line = bufferedReader.readLine())) {
String[] str = line.split(splitChar);
DaTrsSeg daTrsSeg = new DaTrsSeg();
Field[] declaredFieldList = daTrsSeg.getClass().getDeclaredFields();
filedTarget.forEach((columnIndex, titleIndex) -> {
try {
String value = str[titleIndex];
/**
* 由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
*/
declaredFieldList[columnIndex].setAccessible(true);
/**
* 通过反射 对 对象赋值
*/
declaredFieldList[columnIndex].set(daTrsSeg, value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
daTrsSegList.add(daTrsSeg);
}
}
获取实体类字段对应csv中的下标值MAP
/**
* 获取实体类字段对应csv中的下标值MAP
*/
public static Map<Integer, Integer> getFiledTargetMap(List<String> columns, List<String> titleList) {
//前面实体索引,后面字段索引
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < columns.size(); i++) {
int index = titleList.indexOf(columns.get(i));
if (index >= 0) {
map.put(i, index);
}
}
return map;
}