我使用以下代码过滤了具有以下扩展名的文件
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;
}
}
}
但是不确定是否已经有与此相关的类。 有这样的课程吗?
答案 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来列出目录并根据后缀过滤文件。