Java - FilenameFilter和FileFilter的區別

 FilenameFilter和FileFilter接口都是用於文件的篩選。但是方法的參數有所不同:

 FilenameFilter 接口:boolean accept(File dir,String name); 其中dir爲當前目錄,name是文件名。

 FileFilter接口:boolean accept(File pathname);pathname則爲文件

 

到此我們只能看出他們參數的不一致。爲了進一步瞭解,我們看一下他們執行時的情況。

通常我們會用下面三個函數進行使用文件過濾器。

public String[] list(FilenameFilter filter);      // 返回的是符合要求的文件名稱,以字符串數組返回

public File[] listFiles(FilenameFilter filter);  // 返回的是符合要求的文件,以文件類型返回

public File[] listFiles(FileFilter filter);           // 返回的是符合要求的文件,以文件類型返回

其中,list方法由於返回字符串形式,所以,只支持FilenameFilter參數。當我們只需要文件名,並不需要對文件進行操作時,選擇list方法簡單高效。

重點比較listFiles(FilenameFilter filter)和listFiles(FileFilter filter)。從返回結果和功能上,它們並沒有什麼區別,都是選取符合某種條件的File類型數據。

我們看一下具體回調過程:

    /** 返回當前目錄下  符合文件過濾器 filter.accept(File dir,String name)的文件名稱 */
    public String[] list(FilenameFilter filter) {
        String names[] = list();
        if ((names == null) || (filter == null)) {
            return names;
        }
        List<String> v = new ArrayList<>();
        for (int i = 0 ; i < names.length ; i++) {
            if (filter.accept(this, names[i])) {
                v.add(names[i]);
            }
        }
        return v.toArray(new String[v.size()]);
    }

     /** 返回當前目錄下  符合文件過濾器 filter.accept(File dir,String name)的文件數組 */
    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));     // 字符串匹配成功了,再新建file
        return files.toArray(new File[files.size()]);
    }

    /** 返回當前目錄下  符合文件過濾器 FileFilter filter.accept(File name)的文件數組 */
    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()]);
    }

我們發現,最大的不同就是,listFiles(FilenameFilter filter)是先用字符串匹配,匹配成功後創建File對象。

而listFiles(FileFilter filter),則不同,直接先創建File對象使用File對象進行匹配

 

所以。不對文件進行操作,只篩選的話從效率上說,listFiles(FilenameFilter filter)是更快的。

如果需要對文件進行操作,則listFiles(FileFilter filter)更加方便。

 

應用:


import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;

public class FileExp {

    public static void printf(Object[] obj){
        for(Object o : obj){
            System.out.println(o.toString());
        }
    }

    public static void main(String[] args){
        File path = new File("E:\\intellij");
        printf(path.list());

        printf(path.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                Pattern pattern = Pattern.compile("pythonCode");
                return pattern.matcher(name).matches();
            }
        }));

        printf(path.listFiles(new FileFilter(){

            @Override
            public boolean accept(File pathname) {
                Pattern pattern = Pattern.compile("pythonCode");
                return pattern.matcher(pathname.getName()).matches();
            }
        }));

        printf(path.listFiles((dir,name)->{
                Pattern pattern = Pattern.compile("pythonCode");
                return pattern.matcher(name).matches();

        }));
    }

}

運行結果

a.txt
advanced
alg
exp
jedis-master
pythonCode
source
spark-2.3.1-rc4
E:\intellij\pythonCode
E:\intellij\pythonCode
E:\intellij\pythonCode

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章