使用FilenameFilter

时间:2013-11-12 15:19:20

标签: java file-io java-io

我有一个目录:

File dir = new File(MY_PATH);

我想列出所有名称都表示为整数字符串的文件,例如: “10”,“20”。我知道我应该使用:

dir.list(FilenameFilter filter);

如何定义FilenameFilter

P.S。我的意思是文件名可以是任何整数字符串,例如“10”或“2000000”或“3452345”。只要文件名是整数字符串,就没有数字限制。

5 个答案:

答案 0 :(得分:27)

您应该在界面 accept覆盖 FilenameFilter,并确保参数name只有数字字符。您可以使用matches

进行检查
String[] list = dir.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.matches("[0-9]+");
    }
});

答案 1 :(得分:5)

最好作为匿名内部类的一个实例,作为参数传递给File#list

例如,

仅列出以扩展名.txt结尾的文件:

File dir = new File("/home");
String[] list = dir.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});

要仅列出文件名为2位正整数的文件,您可以在accept方法中使用以下内容:

return name.matches("\\d{2}");

表示一位或多位数字:

return name.matches("\\d+");    

编辑(作为对@ crashprophet评论的回应)

将一组文件扩展名传递给列表

class ExtensionAwareFilenameFilter implements FilenameFilter {

    private final Set<String> extensions;

    public ExtensionAwareFilenameFilter(String... extensions) {
        this.extensions = extensions == null ? 
            Collections.emptySet() : 
                Arrays.stream(extensions)
                    .map(e -> e.toLowerCase()).collect(Collectors.toSet());
    }

    @Override
    public boolean accept(File dir, String name) {
        return extensions.isEmpty() || 
            extensions.contains(getFileExtension(name));
    }

    private String getFileExtension(String filename) {
        String ext = null;
        int i = filename .lastIndexOf('.');
        if(i != -1 && i < filename .length()) {
            ext = filename.substring(i+1).toLowerCase();
        }
        return ext;
    }
}


@Test
public void filefilter() {
    Arrays.stream(new File("D:\\downloads").
        list(new ExtensionAwareFilenameFilter("pdf", "txt")))
            .forEach(e -> System.out.println(e));
}

答案 2 :(得分:2)

从Java 8开始,您可以简单地使用lambda表达式来指定自定义过滤器:

dir.list((dir1, name) -> name.equals("foo"));

在上面的示例中,只有名称为“ foo”的文件才能通过。当然,请使用您自己的逻辑。

答案 3 :(得分:1)

我这样做:

    File folder = new File(".");
    File[] listOfFiles = folder.listFiles();
    for (File file : listOfFiles) {
        if (file.isFile()) {
            if (file.toString().endsWith(".sql")) {
                System.out.println(file.getName());
            }
        }
    }
    System.out.println("End!!");

答案 4 :(得分:0)

这就是我的想法。它使用了很好的lambda表达式,可以很容易地将其扭曲到您自己的设计中。

File folder = new File(FullPath);
String[] files = folder.list((lamFolder, lamName) -> lamName.matches("[0-9]+"));
if(files == null) {
    System.out.println("Stuff wrongly: no matching files found.");
} else {
    for(String file : files) {
        System.out.println("HOORAY: I found this "+ file);
    }
}