java实现文件夹中只保留指定数目的最新文件,删除生成时间最早的文件

注意:这种方法只适用于文件命名规则是关于日期的。如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显得容易理解

猜你喜欢

转载自blog.csdn.net/qq_31371757/article/details/84940733