Java学习:File类中的过滤器接口
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[]数组
底层源码解析:
public String[] list(FilenameFilter filter) { String names[] = list();//把所有目录文件列出来 if ((names == null) || (filter == null)) {//如果没有目录或者文件,返回null return names; } ArrayList v = new ArrayList(); for (int i = 0 ; i < names.length ; i++) {//找到文件,遍历 if (filter.accept(this, names[i])) { v.add(names[i]);/把满足条件的放到List集合中 } } return (String[])(v.toArray(new String[v.size()])); }
FilenameFilter 接口
接口方法:
- boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
- dir - 被找到的文件所在的目录。
- name - 文件的名称。
返回:
- 当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
代码:
- 需求找出某个路径下面以.java结尾的文件。
实现:FilenameFilter 接口
import java.io.File; import java.io.FilenameFilter; public class FileterByJava implements FilenameFilter { private String caiName;//传入过滤的名称 public FileterByJava(String caiName){ this.caiName = caiName; } @Override public boolean accept(File dir, String name) { System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:D:\cai\Test_____name:a.txt } }
import java.io.File; import java.io.FilenameFilter; public class FileListFilter { public static void main(String[] args){ ListFileFileterByjava(); } /* 使用实现FilenameFilter接口的方法, 过滤String[] list(FilenameFilter filter) 文件名过滤 */ public static void ListFileFileterByjava(){ 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 void ListFileNameFileter(){ File f = new File("D:"+File.separator+"cai"+File.separator+"Test"); String[] files = f.list(new FilenameFilter() {//使用匿名内部类的方法 @Override public boolean accept(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内部类的方法,进行操作:
代码:
import java.io.File; import java.io.FileFilter; public class CaiNiao { public static void main(String[] args){ File dir = new File("D:\\caidir"); ListFileFileter(dir); } /* 现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,过滤文件类型为.bak文件 */ public static void ListFileFileter(File dir){ if(dir.exists()){ //匿名内部类,把FileFilter接口对象作为参数 File[] files = dir.listFiles(new FileFilter() { @Override public boolean accept(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.length;i++){ if(files[i].isFile()){//如果遍历到的是文件,直接删除 files[i].delete(); }else{//还是目录,继续遍历,直到是文件,再删除 ListFileFileter(files[i]); } } }else{ throw new RuntimeException("操作的文件或者目录不存在!"); } } }
/* 第二中方法实现接口,使用真实类的对象: */ import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; /** * * 需求:输入一个文件目录,之后将里面所有备份的文件删除,备份文件都是以".bak" 和".BAK"结尾 * */ public class FileterByFile implements FileFilter { @Override public boolean accept(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"); } }
import java.io.File; import java.io.FileFilter; public class FileFilterDemo { public static void main(String[] args){ File dir = new File("E:\\复件 demodir"); ListFileFileterBak(dir); } /** * 删除满足条件的文件 * @param dir */ public static void ListFileFileterBak(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("操作的文件或者目录不存在!"); } } }
愿路途漫长,以后莫失莫忘。 愿你不骄不躁,安稳顺心。
作者:菜鸟-传奇
本文版权归作者和博客园共有,重在学习交流,不以任何盈利为目的,欢迎转载。
敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。