Java - 根据当前日期检查文件名?

时间:2013-02-28 10:07:29

标签: java date directory

我还是Java新手,我正在创建一个小程序,它必须检查一个文件夹,里面填充了以YYYYMMDD格式创建日期后命名的数千个文件(例如{{1}如果它发现它们超过一周,则将它们移动到一个新目录中。目前,我的代码可以扫描文件夹并给我一个文件名列表,如果它发现有多个文件,则会创建他们需要移入的文件夹,但我怎么会真正去做检查文件名并在超过7天时移动它们?

这是我到目前为止所拥有的:

20130228

5 个答案:

答案 0 :(得分:1)

class OldFileFilter extends FileFilter {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    public boolean accept(File f) {
        Date date = dateFormat.parse(f.getName());
        return System.currentTimeMillis() - date.getTime() > 7 * 24 * 3600 * 1000;
    }

    public String getDescription() {
        return "Filter old files";
    }
}

File[] files = dir.listFiles(new OldFileFilter());
//Then move...

对于Java 7中的nio,请检查How to replace File.listFiles(FileFilter filter) with nio in Java 7

答案 1 :(得分:0)

可能有两种解决方案

1-要获取文件的最后修改日期,我们可以使用File类的lastModified()方法。此方法返回一个long值。获取此值后,您可以创建java.util.Date类的实例并将此值作为参数传递。此日期将保留文件的最后修改日期。

您可以获取所有文件,并将lastModified日期的每个文件与您请求的日期进行比较。

2-

public static void deleteFilesOlderThanNdays(int daysBack, String dirWay, org.apache.commons.logging.Log log) {

    File directory = new File(dirWay);
    if(directory.exists()){

        File[] listFiles = directory.listFiles();            
        long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
        for(File listFile : listFiles) {
            if(listFile.lastModified() < purgeTime) {
                if(!listFile.delete()) {
                    System.err.println("Unable to delete file: " + listFile);
                }
            }
        }
    } else {
        log.warn("Files were not deleted, directory " + dirWay + " does'nt exist!");
    }
}

此处而不是删除您应将这些文件移动到所需的文件夹。

答案 2 :(得分:0)

解析文件名,检查now和date之间的差异&gt; 7天

Date date = dateFormat.parse(file.getName());
if (System.currentTimeMillis() - date.getTime() > 7 * 24 * 3600 * 1000) {
    // older than 7 days
}

答案 3 :(得分:0)

您可以通过将文件名与当前日期进行比较来完成此操作:

          SimpleDateFormat formatter;
          formatter = new SimpleDateFormat("yyyyMMdd");
          Date d = null;
          try {
            d = formatter.parse(filename);//filename of the file
        } catch (ParseException e) {
            e.printStackTrace();
        }

     Date newDate = new Date();
    if (newDate.getTime() - d.getTime() > 7 * 24 * 3600 * 1000) {
        //Whatever You want to do
    }

答案 4 :(得分:0)

一些想法......

谨防省略跟踪时间。我知道你在思考整天。但请记住,一天的开始和结束取决于时区。如果未指定时区,则使用JVM的默认值。这意味着,如果您在其他计算机/服务器上部署了应用程序,或者计算机/ JVM的时区已更改,则会出现不同的行为。

如果您的格式中包含连字符,则您将遵循常见的ISO 8601格式:YYYY-MM-DD。这种格式更容易阅读。 Joda-Time也很方便地使用这种格式(如下所述)。

据我所知,当你在文件夹/目录中存储超过两三千个文件时,大多数文件系统都会变得暴躁。验证本机操作系统文件系统的行为,或者将文件分组到嵌套文件夹中,例如按月或按年分组。

约达时间

使用Joda-Time库可以更轻松地完成此类日期工作。 java.util.Date&amp;与Java捆绑在一起的Calendar类非常麻烦,应该避免使用。

在Joda-Time中,如果您确实想要忽略时区和时区,请使用LocalDate类。否则,请使用DateTime类加上DateTimeZone对象。

LocalDate now = LocalDate.now();
LocalDate weekAgo = now.minusWeeks( 1 );

String input = "20130228";

DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyyMMdd" );
LocalDate fileLocalDate = formatter.parseLocalDate( input );

boolean isThisFileOld = fileLocalDate.isBefore( weekAgo );