公司业务的需求:将指定目录下的txt文件,按文件名(yyyy-MM-dd.txt)倒排,取出最新的一个文件,读取并转化成javaBean,然后批量入库
txt文件样例:11&&5456&&klkl&&ygy&&88&&00&&121&&kkk&&2342&&yy&&tt&&rr&&ee
注:用&&隔开值
实现:
1.获取到文件:
/*1.读取文件所在位置*/
File dir = new File("D:/data");
//获取文件列表
File[] files = dir.listFiles();
//根据文件名倒排
List<File> collect = Arrays.asList(files).stream()
.sorted(Comparator.comparing(File::toString).reversed())
.collect(Collectors.toList());
File file = new File(collect.get(0).toString());
2.编写读取和转化bean工具类
public class ReadTxt {
/**
* 1.一次性读取txt文件的内容 将文件内容存入集合
* @param file 想要读取的文件对象
* @return 返回文件内容
*/
public static <T> ArrayList<T> txt2String(Class<T> clazz,File file){
ArrayList<T> al = new ArrayList<>();
try{
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次读一行
String[] sz = s.split("&&");
//反射获取类所有的属性
Field[] declaredFields = clazz.getDeclaredFields();
if(sz.length!=declaredFields.length){//长度不一致,说明数据有问题,直接返回
return al;
}
T t = clazz.newInstance();
for (int i = 0; i < declaredFields.length; i++) {
declaredFields[i].setAccessible(true);//忽略访问修饰符的检查
declaredFields[i].set(t,sz[i]);//给属性赋值
}
al.add(t);
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return al;
}
}
3.调用
ArrayList<Info> al = ReadTxt.txt2String(Info.class,file);