java有文件应该按xxx.xxx.xxx.001.log,xxx.xxx.xxx.002.log以此类推排序,我应该怎么校验他是否按此规则排序比如是否是001,002,004,003或者是否有遗漏比如001,002,004少了一个这样
File file = new File("目标文件夹路径");
File[] files = file.listfiles();
List<File> list = new ArrayList<File>();
for(File f : files){
if(f.getName().matches("^xxx.xxx.xxx.\\d{3}.log$")){// 如果文件名符合要求
list.add(f);
}
}
Collections.sort(list, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
String s1 = o1.getName();
String s2 = o2.getName();
return Integer.parseInt(s1.split("[.]")[3])-Integer.parseInt(s2.split("[.]")[3]);
}
});
// 这时候list已经排序好了,我们进行第二次排序,第二次排序是为了计算是否有漏网
Collections.sort(list, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
String s1 = o1.getName();
String s2 = o2.getName();
int i = Integer.parseInt(s1.split("[.]")[3])-Integer.parseInt(s2.split("[.]")[3]);
if(Math.abs(i)==0){
System.out.println("文件排序重复[s1="+s1+"],[s2="+s2+"]");
}else if(Math.abs(i)==1){
System.out.println("文件排序正常");
}else{
System.out.println("漏掉了["+i+"]个文件,在文件["+s1+"]和文件["+s2+"]之间");
}
return 0;// 表示按照原来顺序,因为我们其实已经排序过了
}
});
这种用正则表达式是无法实现的,只能用正则保证格式正确,然后用代码校验数据的正确性
通过IO操作类获取当前文件夹下所有的log日志的文件名称。
再通过一个正则表达式用来检验获取的文件名是否符合要求(正则用静态的还是非静态的看需求,因为加载正则比较耗费性能)。
对于不满足格式的文件按照自己的业务进行处理,满足条件的用一个List集合保存起来(假设前面的xxx是不看重的信息,那么可以直接截取掉,留下002这样的便可以了,也可以直接转换为int类型数据)
直接通过Java的自带排序对List进行排序,便可以获得001,002,003的排序结构了,最后只要判断一下前一个数+1是否等于后一个数即可。