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的好. html
/**java
File類: 數組
* 使用 String[] list(FilenameFilter filter)遍歷指定目錄下面,指定的後綴的文件。ide
底層怎麼實現過濾的?性能
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。
*
*/ui
代碼:this
1.需求找出某個路徑下面以.java結尾的文件。spa
實現:FilenameFilter 接口:code
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FilenameFilter; public class FileterByJava implements FilenameFilter { private String SufixName;//傳入過濾的名稱 public FileterByJava(String SufixName){ this.SufixName = SufixName; } @Override public boolean accept(File dir, String name) { //System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:E:\workspace\IOTest_____name:buf.txt } }
package com.lp.ecjtu.File.filter; 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("E:"+File.separator+"workspace"+File.separator+"IOTest"); 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("E:"+File.separator+"workspace"+File.separator+"IOTest"); 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內部類的方法,進行操做:
代碼:
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FileFilter; public class FileFilterDemo { public static void main(String[] args){ File dir = new File("E:\\復件 demodir"); 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();//獲取文件的名稱E:\復件 demodir\Learn\sgim_piccell.v1.bin.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("操做的文件或者目錄不存在!"); } } }
第二中方法實現接口,使用真實類的對象:
package com.lp.ecjtu.File.filter; 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"); } }
package com.lp.ecjtu.File.filter; 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("操做的文件或者目錄不存在!"); } } }