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("操作的文件或者目錄不存在!");
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM