接口 FileFilter和FilenameFilter
用途:当我们需要过滤掉目录中的某些文件时,可以使用这两个接口!
接口 FileFilter
用于抽象路径名的过滤器。[来自JDKapi]
很绕口对不对!此接口就是对文件的属性(除了文件内容)进行的判断(过滤),然后放行的接口,具体如何判断放行根据具体类实现!
此接口的实例可传递给 File 类的 listFiles(FileFilter) 方法。
原理:先把目录下面的文件调用list()方法全部存放到一个String[]数组里面,然后遍历数组, 把符合filter.accept(f)条件的放到一个ArrayList里面,然后把 List转化为File[]数组.
源码:
public File[] listFiles(FileFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss) {
File f = new File(s, this);
if ((filter == null) || filter.accept(f))
files.add(f);
}
return files.toArray(new File[files.size()]);
}
需要实现的方法 accept:
boolean accept(File pathname)测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:pathname
pathname :要测试的抽象路径名
就是对pathname进行相关判断返回:
当且仅当应该包含 pathname 时返回 true
实现
需求:删除指定目录下文件大于5M的文件
import java.io.File;
import java.io.FileFilter;
/**
* 找出大于xM的文件
* @author Administrator
*
*/
public class MyFileFilter implements FileFilter{
private int size;
public MyFileFilter(int size) {
this.size = size;
}
//对pathname进行判断,如果符合我们要求就return true
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()) {
return false;
}
if(pathname.isFile()) {
System.out.println(pathname.length());
if(pathname.length()>size) {
return true;
}
}
return false;
}
public static void main(String[] args) {
//找出大于5K的文件
File[] files = new File("x:"+File.separator).listFiles(new MyFileFilter(50*1024));
for(File file :files) {
System.out.println(file);
}
}
}
接口 FilenameFilter
实现此接口的类实例可用于过滤器文件名。[来自JDKapi]
个人觉得这个解释并不准确。accept接受的参数dir和name可以确定一个文件,对这个文件的任何判断操作都可以进行,不仅限于文件名。相对于FileFilter的acccpt,就是方便读取文件名。
此接口的实例可传递给 File 类的 public String[] list(FilenameFilter filter) 和 public File[] listFiles(FilenameFilter filter)
方法。
原理:先把目录下面的文件调用list()方法全部存放到一个String[]数组里面,然后遍历数组, 把符合filter.accept(this, names[i])条件的放到一个ArrayList里面,然后把 List转化为String[]数组
源码:
public File[] listFiles(FilenameFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss)
if ((filter == null) || filter.accept(this, s))
files.add(new File(s, this));
return files.toArray(new File[files.size()]);
}
new File(String,File)是私有构造器
这里的accept(this,s)和Fileter中的accept(f)其实是一样的!
需要实现的方法 accept:
boolean accept(File dir,String name)测试指定文件是否应该包含在某一文件列表中。
参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
这个方法就是通过判断 参数File file 和String name的关系。如果之间的关系符合某个要求我们就返回true.
代码:
需求:找出文件后缀为‘.settings’的文件
import java.io.FilenameFilter;
public class MyFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
//System.out.println("dir:"+dir);
//System.out.println("name:"+name);
if (name.endsWith(".settings")) {
return true;
}
return false;
}
public static void main(String[] args) {
String[] str = (String[]) new File(System.getProperty("user.dir")).list(new MyFilenameFilter());
for (String string : str) {
System.out.println(string);
}
}
}
这里的功能可以由FileFilter扩展过来,两个可以相互转化
accept(File pathname){
System.out.println(pathname.getParent());
System.out.println(pathname.getName());
}
accept(File dir, String name) {}
这里的写法可以相互转换。