排除文件过滤器

Exclude File Filter

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

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;
        }

    }
}

但不确定是否已经有 classes 了。 有这样的class吗?

没有内置的 FileFilter 实现来处理像您这样的常见情况。
简而言之,您可以使用匿名 class 或更好的 lambda,因为 FileFilter 是一个功能接口,例如 :

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

由于您已经在使用 commons-io,请查看 NotFileFilter

鉴于您的用例,示例如下所示:

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

您可以使用 notFileFilter:

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

您没有使用 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 来列出目录并根据其后缀过滤文件。