注意:这种方法只适用于文件命名规则是关于日期的。如2018-12-10_log.txt类型。
假设只想让文件夹中保留最新的max个文件
第一步:得到该文件夹下的文件数目n。
第二步:如果数目n > max(需要执行删除文件操作),遍历文件夹,得到关于文件名和和文件名时间戳的map。如<1453453547365,2018-12-10_log.txt>。
第三步:得到map里最小的key值,从而得到对应的value,即为应该删除的文件名。
参考代码:
/**
* 删除文件夹中最早产生的一个文件,如csv文件夹永远只保留max=30个最新的文件,超过30则删除一个文件
* 注意:是根据文件命名来delete的,所以必须要有公共的命名规则
*
* @param commonFileSuffix 文件夹下的文件名的公共后缀:如_log.txt
* @param fileDir 文件夹名称
* @param max 文件夹下最多的文件数量
* @param format 时间格式
*/
public static void deleteFurthestFile(String fileDir, String format, final String commonFileSuffix, final int max) {
try {
File dir = new File(fileDir);
if (!dir.exists())
return;
int currentNum = 0;
if (dir.exists())
currentNum = dir.listFiles().length; //得到当前文件夹文件数目
if (currentNum > max) { //删除产生时间最早的一个文件
//得到文件名的一个map
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Map<Long, String> map = new HashMap<>();
for (File file1 : dir.listFiles()) {
String time = file1.getName().replace(commonFileSuffix, "");
Date date = simpleDateFormat.parse(time);
map.put(date.getTime(), file1.getName()); //<1233282716409,2018-2-1_log.txt>
}
//产生时间最早的文件名
long lt = Long.valueOf(Collections.min(map.keySet()).toString());
File f1 = new File(fileDir + map.get(lt));
if (f1.exists())
f1.delete();
}
} catch (ParseException e) {
e.printStackTrace();
}
}
调用举例:
每在文件夹下生成一个文件的时候,都调用此方法,看是否需要删除。
deleteFurthestFile("c:\\test1\\","_log.txt","yyyy-MM-dd", 7); //文件名 2018-12-10_log.txt
//deleteFurthestFile("c:\\test2\\",".csv","yyyy/MM/dd", 8); //文件名格式 2018/12/10.csv
其中Collections.min()是java里提供的方法,可以直接用。类似的List、Map也有对应的Collections.sort()、Collections.max()等,不用再另外写排序。
不足:
1、文件名的命名规则限制了他的适用场景
2、可以不用map,因为key和value上其实可以相互计算,但是map显得容易理解