排除文件过滤器

时间:2018-08-17 09:59:53

标签: java apache-commons-io

我使用以下代码过滤了具有以下扩展名的文件

FileFilter fileFilter= new WildcardFileFilter("*.docx");
File[] sampleFiles= filesDirectory.listFiles(fileFilter);

但是,如果我想相反的话,我想排除具有此扩展名的文件。 目前,我有以下代码

public class FileFilter {
    public static void main(String[] args) {
        File dir = new File("C:\\temp\\filter-exclude");

        File[] files = dir.listFiles(new ExcludeFilter());
        for (File f : files) {
            System.out.println("file: " + f.getName());
        }
    }

    public static class ExcludeFilter implements java.io.FileFilter {

        @Override
        public boolean accept(File file) {
            if (file.getName().toLowerCase().endsWith("docx")) {
                return false;
            }
            return true;
        }

    }
}

但是不确定是否已经有与此相关的类。 有这样的课程吗?

4 个答案:

答案 0 :(得分:4)

您可以编写notFileFilter

dir.listFiles(
 FileFilterUtils.notFileFilter(
   FileFilterUtils.suffixFileFilter(".docx")))

答案 1 :(得分:2)

在您已经使用commons-io时,请看一下NotFileFilter

给出您的用例,示例如下:

FileFilter fileFilter = new NotFileFilter(new WildcardFileFilter("*.docx"))
File[] files = dir.listFiles(fileFilter);

答案 2 :(得分:1)

没有内置的FileFilter实现可以处理您的常见情况。
简而言之,您可以使用匿名类,也可以使用lambda,因为FileFilter是一个功能性接口,例如:

 File[] files = dir.listFiles(f -> !f.getName().toLowerCase().endsWith("docx"));

答案 3 :(得分:0)

您是否有任何特定原因而不是使用nio软件包而不是使用旧的io

通过使用nio软件包,您可以使代码大大缩小。通常,您还将使用什么是最好的工具来处理文件和文件系统。看看下面的代码段:

var matcher = FileSystems.getDefault().getPathMatcher("*.docx");
try {
    DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("C:\\temp"), entry -> !matcher.matches(entry));
    stream.forEach(path -> System.out.println("file: " + path.getFileName()));
} catch (IOException e) {
    e.printStackTrace();
}

这有效地完成了您的代码,仅使用nio软件包提供的现成API来列出目录并根据后缀过滤文件。