javaIO类的File类应用:过滤器接口
FilenameFilter和FileFilter都是用来过滤文件的
例如:
过滤以.jpg或者.java结尾的文件。
通过看他们的源码:
通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boolean accept(File pathname)方法来过滤出满足条件的文件。
区别:FilenameFilter的性能比FileFilter的好。
File类
使用 String[] list(FilenameFilter filter)遍历指定目录下面,指定的后缀的文件。
底层怎么实现过滤的?
String[] list(FilenameFilter filter)
原理:
先把目录下面的文件调用list()方法全部存放到一个String[]数组里面,然后遍历数组
把符合filter.accept(this, names[i])条件的放到一个ArrayList里面,然后把List转化为String[]数组
底层源码解析:
publicString[] list(FilenameFilter filter) {
String names[]= list();//把所有目录文件列出来
if ((names == null) || (filter == null)) {//如果没有目录或者文件,返回null
returnnames;
}
ArrayList v= newArrayList();for (int i = 0 ; i < names.length ; i++) {//找到文件,遍历
if (filter.accept(this, names[i])) {
v.add(names[i]);/把满足条件的放到List集合中
}
}return (String[])(v.toArray(newString[v.size()]));
}
FilenameFilter 接口
接口方法:
boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
代码:
需求找出某个路径下面以.java结尾的文件。
实现:FilenameFilter 接口
importjava.io.File;importjava.io.FilenameFilter;public class FileterByJava implementsFilenameFilter {private String caiName;//传入过滤的名称
publicFileterByJava(String caiName){this.caiName =caiName;
}
@Overridepublic booleanaccept(File dir, String name) {System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:D:\cai\Test_____name:a.txt
}
}
importjava.io.File;importjava.io.FilenameFilter;public classFileListFilter {public static voidmain(String[] args){
ListFileFileterByjava();
}/*使用实现FilenameFilter接口的方法,
过滤String[] list(FilenameFilter filter)
文件名过滤*/
public static voidListFileFileterByjava(){
File f= new File("D:"+File.separator+"cai"+File.separator+"Test");
String[] fileNames= f.list(new FileterByJava(".java"));//使用具体对象,把过滤后的以.java文件的文件放到数组当中
System.out.println(fileNames.length);//含有.java文件数组的长度
for(String name:fileNames){//遍历找到的.java文件
System.out.println(name);
}
}/*列出指定目录下,后缀为.java的文件,使用方法String[] list(FilenameFilter filter)使用匿名内部类的方法*/
public static voidListFileNameFileter(){
File f= new File("D:"+File.separator+"cai"+File.separator+"Test");
String[] files= f.list(new FilenameFilter() {//使用匿名内部类的方法
@Overridepublic booleanaccept(File dir, String name) {//TODO Auto-generated method stub//System.out.println("dir:"+dir+"name....."+name);//测试说明dir表示指定目录,name表示指定目录的名称
return name.endsWith(".java");//通过匿名内部类的返回值来控制指定目录下面的文件和文件夹的显示,只显示.java文件
}
});
System.out.println(files.length);//遍历指定目录下面的文件和目录
for(String file:files){
System.out.println(file);
}
}
}
FileFilter接口
接口方法:
boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
代码
需求:现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,也就是说过滤文件类型为.bak或者.BAK文件后进行删除.
使用FileFilter内部类的方法,进行操作:
代码:
importjava.io.File;importjava.io.FileFilter;public classCaiNiao {public static voidmain(String[] args){
File dir= new File("D:\\caidir");
ListFileFileter(dir);
}/*现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,过滤文件类型为.bak文件*/
public static voidListFileFileter(File dir){if(dir.exists()){//匿名内部类,把FileFilter接口对象作为参数
File[] files = dir.listFiles(newFileFilter() {
@Overridepublic booleanaccept(File pathname) {if(pathname.isDirectory()){return true;
}
String name= pathname.getName();//获取文件的名称D:\caidir\a.bak
System.out.println("****************"+pathname);return name.endsWith(".bak")|| name.endsWith(".BAK");//过滤文件类型为.bak或者.BAK文件,而不包含.BAK或者.bak的文件
}
});//深度遍历文件,递归
for(int i=0;i
files[i].delete();
}else{//还是目录,继续遍历,直到是文件,再删除
ListFileFileter(files[i]);
}
}
}else{throw new RuntimeException("操作的文件或者目录不存在!");
}
}
}
/*第二中方法实现接口,使用真实类的对象:*/
importjava.io.File;importjava.io.FileFilter;importjava.io.FilenameFilter;/***
* 需求:输入一个文件目录,之后将里面所有备份的文件删除,备份文件都是以".bak" 和".BAK"结尾
**/
public class FileterByFile implementsFileFilter {
@Overridepublic booleanaccept(File pathname) {if(pathname.isDirectory()){return true;
}
String name=pathname.getName();//TODO Auto-generated method stub
System.out.println("****************"+pathname);return name.endsWith(".bak")|| name.endsWith(".BAK");
}
}
importjava.io.File;importjava.io.FileFilter;public classFileFilterDemo {public static voidmain(String[] args){
File dir= new File("E:\\复件 demodir");
ListFileFileterBak(dir);
}/*** 删除满足条件的文件
*@paramdir*/
public static voidListFileFileterBak(File dir){if(dir.exists()){
File[] files= dir.listFiles(new FileterByFile());//使用过滤
for(File file:files){if(file.isDirectory()){
ListFileFileterBak(file);
}else{
file.delete();
}
}
}else{throw new RuntimeException("操作的文件或者目录不存在!");
}
}
}