Java.IO 文件过滤接口 FileFilter和FilenameFilter

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meteorsshower2013/article/details/82907888

接口 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) {}

这里的写法可以相互转换。

参考:
[1]: https://www.cnblogs.com/200911/p/3886802.html

猜你喜欢

转载自blog.csdn.net/meteorsshower2013/article/details/82907888