Apache下的FileUtils.listFiles方法簡單使用技巧


一、引言

Apache提供的很多工具方法非常好用,推薦。

今天在使用的過程中使用到了org.apache.commons.io.FileUtils.listFiles方法,本文主要談談這個工具方法的用法。

查看源碼上的說明是

    /**
     * Finds files within a given directory (and optionally its
     * subdirectories). All files found are filtered by an IOFileFilter.
     * <p>
     * If your search should recurse into subdirectories you can pass in
     * an IOFileFilter for directories. You don't need to bind a
     * DirectoryFileFilter (via logical AND) to this filter. This method does
     * that for you.
     * <p>
     * An example: If you want to search through all directories called
     * "temp" you pass in <code>FileFilterUtils.NameFileFilter("temp")</code>
     * <p>
     * Another common usage of this method is find files in a directory
     * tree but ignoring the directories generated CVS. You can simply pass
     * in <code>FileFilterUtils.makeCVSAware(null)</code>.
     *
     * @param directory  the directory to search in
     * @param fileFilter filter to apply when finding files.
     * @param dirFilter  optional filter to apply when finding subdirectories.
     *                   If this parameter is {@code null}, subdirectories will not be included in the
     *                   search. Use TrueFileFilter.INSTANCE to match all directories.
     * @return an collection of java.io.File with the matching files
     * @see org.apache.commons.io.filefilter.FileFilterUtils
     * @see org.apache.commons.io.filefilter.NameFileFilter
     */

大意就是:

在指定的目錄中(可以指定到子目錄)通過IOFileFilter過濾器查找文件。
比如:
如果你要在所有的名為"temp"的目錄,你可以使用:FileFilterUtils.NameFileFilter("temp")

 二、基本使用

測試目錄下的目錄結構如下所示: 

M:\FileTest
│      5.txt
├─001
│ │    1.txt
│ │    2.txt
│ │ 
│ └─011
│      bc.eddx
│      d.docx
│ 
└─002
       3.txt
       4.txt

最開始僅僅想獲取目錄下的文件,如下方法:

        Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), null, null);
        for (File file : listFiles) {
            System.out.println(file.getName());
        }

此處會拋出錯誤:

其源碼如下:Parameter 'fileFilter' is null"

    private static void validateListFilesParameters(final File directory, final IOFileFilter fileFilter) {
        if (!directory.isDirectory()) {
            throw new IllegalArgumentException("Parameter 'directory' is not a directory: " + directory);
        }
        if (fileFilter == null) {
            throw new NullPointerException("Parameter 'fileFilter' is null");
        }
    }

可以看出,第二個針對文件的過濾器不可以為空。

換成第二種做法:利用FileFilterUtils進行文件過濾器的創建。下面代碼中使用到了 FileFilterUtils.suffixFileFilter("txt") 表示過濾出文件名后綴為txt的文件,第三個參數表示通常表示是否遞歸查詢目錄,null表示遞歸。

    @Test
    public void test2(){
        Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), FileFilterUtils.suffixFileFilter("txt"), null);
        showFiles(listFiles);
    }

    private void showFiles(Collection<File> listFiles) {
        if (listFiles==null) {
            return;
        }
        for (File file : listFiles) {
            System.out.println(file.getName());
        }
    }

上述方法結果是:

5.txt

稍微修改下最后一個參數,將其由null轉變為DirectoryFileFilter.INSTANCE,方法將使用遞歸的形式來進行文件過濾掃描。

    @Test
    public void test3(){
        Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), FileFilterUtils.suffixFileFilter("txt"), DirectoryFileFilter.INSTANCE);
        showFiles(listFiles);
    }

結果為:

1.txt
2.txt
3.txt
4.txt
5.txt

這里需要注意,如果僅僅是過濾后綴,Apache提供了更加簡單的方法:

    @Test
    public void test4(){
        Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), new String[]{"txt"}, true);
        showFiles(listFiles);
    }

方法說明參見上圖,此處時間關系不在贅述。

三、常見文件過濾器

 從其中最靈活的方法簽名中可以得到一些信息:

第二個參數是IOFilFilter fileFilter,通過查看源碼的形式可以知道其為一個接口

很顯然我們查看這個接口有哪些實現類就可以獲得由那些FileFilter。

從上述圖的記過可以看出有基於文件大小的SizeFileFilter,基於文件名稱前綴的PrefixFileFilter...,具體使用情況,依照自己項目情況選擇,我這里就不一一舉例了(0.0 其實我也沒有全部用過~~~)

    @Test
    public void test5(){
        Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), FileFilterUtils.and(EmptyFileFilter.NOT_EMPTY,new RegexFileFilter("^[0-9]+.[a-zA-z]+$")), DirectoryFileFilter.INSTANCE);
        showFiles(listFiles);
    }

因為我的目錄中只有5.txt有點內容,所以最終的結果是5.txt,上面代碼中注意

FileFilterUtils.and(EmptyFileFilter.NOT_EMPTY,new RegexFileFilter("^[0-9]+.[a-zA-z]+$"))

其中表示有2個文件過濾器,其中一個是不為空的文件過濾器,另外一個是查找文件名稱的過濾器,其匹配規則是:"^[0-9]+.[a-zA-z]+$" 即文件名稱只能是一個或者多個數字構成,后綴由一個或多個字母構成。

~~Over

本次博文算是我最用心的一次了。。。。

 


免責聲明!

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



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