首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FilenameFilter的使用

FilenameFilter的使用
EN

Stack Overflow用户
提问于 2013-11-12 15:19:20
回答 5查看 53.4K关注 0票数 25

我有一个目录:

代码语言:javascript
复制
File dir = new File(MY_PATH);

我想列出其名称被表示为整数字符串的所有文件,例如"10“、"20”。

我知道我应该用:

代码语言:javascript
复制
dir.list(FilenameFilter filter);

如何定义我的FilenameFilter

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-12 15:25:43

您应该在接口accept中覆盖FilenameFilter,并确保参数name只有数字字符。您可以通过使用matches来检查这个

代码语言:javascript
复制
String[] list = dir.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.matches("[0-9]+");
    }
});
票数 39
EN

Stack Overflow用户

发布于 2013-11-12 15:21:30

最好是作为匿名内部类的实例传递给File#list

例如,仅列出以扩展名.txt结尾的文件

代码语言:javascript
复制
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方法中使用以下内容:

代码语言:javascript
复制
return name.matches("\\d{2}");

对于一个或多个数字:

代码语言:javascript
复制
return name.matches("\\d+");    

编辑(作为对@crash先知的评论的回应)

传递一组要列出的文件扩展名。

代码语言:javascript
复制
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));
}
票数 9
EN

Stack Overflow用户

发布于 2018-06-27 17:44:38

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

代码语言:javascript
复制
dir.list((dir1, name) -> name.equals("foo"));

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19932962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档