如何检查Java中是否存在带通配符的文件?

时间:2012-01-06 00:49:21

标签: java file wildcard

我有一个目录,其中的文件名为"a_id_XXX.zip"

如何在给定idFile dir

的情况下检查文件是否存在

7 个答案:

答案 0 :(得分:16)

FileFilter(此处为anonymously编码)传递到dir listFiles()File方法,如下所示:

File dir = new File("some/path/to/dir");
final String id = "XXX"; // needs to be final so the anonymous class can use it
File[] matchingFiles = dir.listFiles(new FileFilter() {
    public boolean accept(File pathname) {
        return pathname.getName().equals("a_id_" + id + ".zip");
    }
});


捆绑为方法,它看起来像:

public static File[] findFilesForId(File dir, final String id) {
    return dir.listFiles(new FileFilter() {
        public boolean accept(File pathname) {
            return pathname.getName().equals("a_id_" + id + ".zip");
        }
    });
}

你可以称之为:

File[] matchingFiles = findFilesForId(new File("some/path/to/dir"), "XXX");

或只是检查是否存在,

boolean exists = findFilesForId(new File("some/path/to/dir"), "XXX").length > 0

答案 1 :(得分:5)

我创建了以a_id_123.zip命名的zip文件,a_id_124.zip,a_id_125.zip,a_id_126.zip 看起来工作正常,但我不确定它是否适合你。 如果上面列出的文件存在,则输出如下

  • 找到了a_id_123.zip
  • 找到了a_id_124.zip
  • 找到了a_id_125.zip
  • 找到了a_id_126.zip

    public static void main(String[] args) {
    
        String pathToScan = ".";
        String fileThatYouWantToFilter;
        File folderToScan = new File(pathToScan); // import -> import java.io.File;
        File[] listOfFiles = folderToScan.listFiles();
    
        for (int i = 0; i < listOfFiles.length; i++) {
    
            if (listOfFiles[i].isFile()) {
                fileThatYouWantToFilter = listOfFiles[i].getName();
                if (fileThatYouWantToFilter.startsWith("a_id_")
                        && fileThatYouWantToFilter.endsWith(".zip")) {
                    System.out.println("found" + " " + fileThatYouWantToFilter);
                }
            }
        }
    }
    

答案 2 :(得分:2)

这个解决方案概括了Bohemian的答案。它使用正则表达式,并用Java 8 lambda表达式替换内部类。感谢@Bohemian的原始实现。

import java.io.File;

public class FileFinder {
    public static void main(String[] args){
        File directory = new File("D:\\tmp");
        String id = "20140430104033";
        for (File f : findFilenamesWithId(id, directory)){
            System.out.println(f.getAbsoluteFile());
        }
    }

    /** Finds files in the specified directory whose names are formatted 
        as "a_id_ID.zip" */
    public static File[] findFilenamesWithId(String ID, File dir) {
        return findFilenamesMatchingRegex("^a_id_" + ID + "\\.zip$", dir);
    }

    /** Finds files in the specified directory whose names match regex */
    public static File[] findFilenamesMatchingRegex(String regex, File dir) {
        return dir.listFiles(file -> file.getName().matches(regex));
    }
}

答案 3 :(得分:1)

答案 4 :(得分:1)

Java 7对模式匹配(PathMatcher)和递归目录遍历(Files.walkFileTree())有很好的支持。在原始问题的上下文中,Oracle Java文档中的这个页面是一个良好的开端:

查找文件:http://docs.oracle.com/javase/tutorial/essential/io/find.html

答案 5 :(得分:0)

答案 6 :(得分:0)

使用Java 8在目录和子目录中找到所有具有所需正则表达式条件的文件

我的条件是使用Audit_Report_xxxxxx.xls查找所有文件

// get List of Audit Report file in directory and sub directory
public List<String> getAuditReporFile(String baseDirectory) throws Exception{

    // select all available files in directory and subdirectory
    return Files.walk(Paths.get(baseDirectory))
            .filter(Files::isRegularFile).filter(x-> {

                // use regex and check if file name is according to our requirement
                return Pattern.compile("Audit_Report_.*\\.xls").matcher(x.getFileName().toString()).find();

            }).map(x->x.getFileName().toString()).collect(Collectors.toList());
}