提取文件名中指定字符串 java实现
有这样格式的一些文件名:abcd.txt.20171221.gz 前面abcd可变的,后面都是一样。
现在需要做的是,将时间小于某指定时间的文件全部删除。这里的需求是 删除当前时间五天前的所有文件
五天前的时间这样表示:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -5);
String oldDate = sdf.format(calendar.getTime());
思路:将文件名中的时间提取出来,与五天前的时间进行对比,若小于该时间,则进行删除。
下面就是对提取文件名中的时间问题的解决思路了。
于是我最开始想到了一个办法,实现之后感觉好傻,且不实用,复用性极低。方法如下:
哦,对,在提取文件名中的时间字符串之前,先要说明一下,这个是从某文件夹中获取到的文件列表,提取文件列表中的这些文件名,好了,下面开始说我的方法了
File file = new File(filePath);
File [] files = file.listFiles();
for(File f:files){
String date = f.getName().substring(f.getName().lastIndexOf(".")-8,f.getName().lastIndexOf("."));
if(date.compareTo(oldDate) <= 0){
oldDate = date;
new File(filePath).delete();
}
对于这个
String date = f.getName().substring(f.getName().lastIndexOf(".")-8,f.getName().lastIndexOf("."));
我也是很鸡肋,哈哈哈,感觉太傻了。后来我又想到了第二种方法:
2.用split()对字符串进行分割
因为这个文件名很有规律,so,
String strs[] = f.getName().split("\\.");
if(strs[2].compareTo(oldDate)<=0){
oldDate = strs[2];
}
注意这个split(“\\.”) 要加反斜杠进行转义。
不过这个方法吧,也不是那么好,因为后来发现,不是所有文件都是用 ” . ” 来分割的。
于是又有了方法3:用正则表达式提取出连续的8位数字字符串,感觉这个应该是目前最完美的解决办法啦。
Pattern p = Pattern.compile("[0-9]{8}");
Matcher m = p.matcher(f.getName());
if(m.find()){
if(m.group().compareTo(oldDate) <= 0){
oldDate = m.group();
}
}
从这个小任务中学到了不少东西,之前也有用过substring对文件名进行提取过,所以第一种就想到了substring这个方式,后来发现,要提取文件名中某一部分字符串,而且还是多个”.”分割的名字,这就有点鸡肋了;后面找到了split方法,也不错,但仅限于相同文件类型,相同格式名字的文件名字符串提取,不是很好,复用性比较低,且还要保证文件夹中所有文件至少能被分割成3段,比如,我在测试的过程中,某文件夹中有这样一个文件,ancd.txt , 这个用split(“.”)分割的话,只有2部分,而后面的strs[2],则会报数组越界的错误,这一点还是要注意的。
权衡利弊,还是第三种更简单方便,复用性高。
转载自:https://blog.csdn.net/alinekang/article/details/78982561