使用FilenameFilter

Lee*_*fin 15 java file-io java-io

我有一个目录:

File dir = new File(MY_PATH);
Run Code Online (Sandbox Code Playgroud)

我想列出名称为整数字符串的所有文件,例如"10","20".
我知道我应该使用:

dir.list(FilenameFilter filter);
Run Code Online (Sandbox Code Playgroud)

如何定义我的FilenameFilter

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

Mar*_*oun 30

您应该在界面中覆盖 并确保参数只有数字字符.您可以使用以下方法检查:accept FilenameFilternamematches

String[] list = dir.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.matches("[0-9]+");
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 预编译模式是一种好习惯. (5认同)

Grz*_*rek 7

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

dir.list((dir1, name) -> name.equals("foo"));
Run Code Online (Sandbox Code Playgroud)

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

  • @gaurav 只需使用 `matches` 方法,如下所示: `dir.list((dir1, name) -> name.matches("[0-9]+"));` (3认同)

A4L*_*A4L 6

最好是作为参数传递给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");
    }
});
Run Code Online (Sandbox Code Playgroud)

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

return name.matches("\\d{2}");
Run Code Online (Sandbox Code Playgroud)

对于一个或多个数字:

return name.matches("\\d+");    
Run Code Online (Sandbox Code Playgroud)

编辑(作为回应@ 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));
}
Run Code Online (Sandbox Code Playgroud)