文件名筛选器的使用
我有一个目录:
File dir = new File(MY_PATH);
我想列出所有名称以整数字符串表示的文件,例如“10”,“20”。
我知道我应该使用:
dir.list(FilenameFilter filter);
如何定义我的?FilenameFilter
附言我的意思是文件名可以是任何整数字符串,例如“10”或“2000000”或“3452345”。只要文件名是整数字符串,对位数没有限制。
我有一个目录:
File dir = new File(MY_PATH);
我想列出所有名称以整数字符串表示的文件,例如“10”,“20”。
我知道我应该使用:
dir.list(FilenameFilter filter);
如何定义我的?FilenameFilter
附言我的意思是文件名可以是任何整数字符串,例如“10”或“2000000”或“3452345”。只要文件名是整数字符串,对位数没有限制。
您应该覆盖接口中的 accept 文件名筛选器
,并确保参数只有数字字符。您可以使用
匹配项
对此进行检查:name
String[] list = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches("[0-9]+");
}
});
最好作为匿名内部类的实例作为参数传递给 File#list。
例如,要仅列出以扩展名结尾的文件:.txt
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 方法中使用以下命令:
return name.matches("\\d{2}");
对于一个或多个数字:
return name.matches("\\d+");
编辑(作为对@crashprophet评论的回应)
将一组扩展名文件传递到列表
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));
}