排除文件过滤器
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 来列出目录并根据其后缀过滤文件。
我使用以下代码过滤具有以下扩展名的文件
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 来列出目录并根据其后缀过滤文件。