如何在选择与给定模式匹配的所有文件时获取当前日期的文件

时间:2014-12-19 15:50:35

标签: java regex unix operating-system java-7

public static List<String> getLogFiles(String logLocation, final String pattern) {
    File logDirectory = new File(logLocation);
    String[] files = new String[]{};            
    if (logDirectory.isDirectory()) {
        files = logDirectory.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return name.matches(pattern);
            }

        });
    }


    return Arrays.asList(files);
}

如果我在上面的代码段中传递了/tmp/logs*.log的正则表达式,我会获取所有日期的所有日志文件,但我希望将结果仅限于今天的日期文件。在获得上面的整个列表后,我可以用Java 7完成这项工作,还是有更好的方法?

我将使用jdk 1.7_71 64位JVM在Unix机器上运行它。

2 个答案:

答案 0 :(得分:1)

使用File.lasModified方法比较文件日期修改,请尝试以下代码:

public static List<String> getLogFiles(String logLocation, final String pattern, String date) throws ParseException
{
   File logDirectory = new File(logLocation);
   String[] files = new String[] {};

   SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy");
   Date d = f.parse(date);
   long milliseconds = d.getTime();

   if (logDirectory.isDirectory())
   {
     files = logDirectory.list(new FilenameFilter()
     {

        @Override
        public boolean accept(File dir, String name)
        {
            return name.matches(pattern) && new File(dir, name).lastModified() > milliseconds;
        }
    });
  }
  return Arrays.asList(files);
}

答案 1 :(得分:0)

您可以使用apache commons-io库,它提供预定义的过滤器并支持过滤器链接。

AgeFileFilter ageFilter = new AgeFileFilter(milliseconds, false);    
WildcardFileFilter wildcardFilter = new WildcardFileFilter(pattern);    
Collection<File> files = FileUtils.listFiles(logDirectory, new AndFileFilter(ageFilter, wildcardFilter), TrueFileFilter.INSTANCE);

请注意,它返回文件对象的集合,而不是字符串数组。