<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0

    【一】需求

    查找某個指定目錄下,創建日期在指定日期之前,且開頭為指定前綴,結尾為指定類型,大小大于指定size的文件。例如:查找我本地磁盤上位于:E:\Other\Picture\私人 目錄下,創建日期在2010年1月2日之前,開頭為IMG_、DSCN,類型為JPG、GIF,且大小超過2M的圖片資源文件。

    【二】簡介

    1.基本功能過濾器
    =============================================
    ①類型:DirectoryFileFilter、FileFileFilter
    ②大小:EmptyFileFilter、SizeFileFilter
    ③時間:AgeFileFilter
    ④名稱:NameFileFilter、PrefixFileFilter、SuffixFileFilter、RegexFileFilter、WildcardFileFilter
    ⑤讀寫屬性:CanReadFileFilter、CanWriteFileFilter
    ⑥隱藏屬性:HiddenFileFilter

    2.邏輯關系過濾器
    =============================================
    ①邏輯與:AndFileFilter
    ②邏輯或:OrFileFilter
    ③邏輯非:NotFileFilter
    ④永真/假:TrueFileFilter、FalseFileFilter

    3.過濾器容器
    =============================================
    ①工具類:FileFilterUtils


    【三】思路

    ①使用遞歸方法遍歷所有目錄
    ②采用FileFilter定義的各種類型進行組合

    具體思路通過閱讀代碼可以知道

    【四】代碼

    package example.io;

    import java.io.File;
    import java.io.FileFilter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Collection;
    import java.util.Date;
    import java.util.List;

    import org.apache.commons.io.DirectoryWalker;
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.IOCase;
    import org.apache.commons.io.filefilter.AgeFileFilter;
    import org.apache.commons.io.filefilter.AndFileFilter;
    import org.apache.commons.io.filefilter.FileFilterUtils;
    import org.apache.commons.io.filefilter.IOFileFilter;
    import org.apache.commons.io.filefilter.PrefixFileFilter;
    import org.apache.commons.io.filefilter.SizeFileFilter;
    import org.apache.commons.io.filefilter.SuffixFileFilter;

    public class ImageFileFilter {

        
    private PrefixFileFilter prefixF;

        
    private SuffixFileFilter suffixF;

        
    private AgeFileFilter ageF;

        
    private SizeFileFilter sizeF;

        
    public static void main(String args[]) {
            ImageFileFilter filter 
    = new ImageFileFilter();

            
    // Set cutoff date
            Calendar instance = Calendar.getInstance();
            instance.set(
    2010, Calendar.JANUARY, 1235959);
            filter.setFileAge(instance.getTime(), 
    true);

            
    // Set prefix
            List<String> prefixs = new ArrayList<String>();
            prefixs.add(
    "IMG_");
            prefixs.add(
    "DSCN");
            filter.setFilePrefix(prefixs);

            
    // Set suffix
            List<String> suffixs = new ArrayList<String>();
            suffixs.add(
    ".jpg");
            suffixs.add(
    ".gif");
            filter.setFileSuffix(suffixs);

            
    // Set size
            filter.setFileSize(1024 * 1024 * 2);

            
    // Union filter conditions
            File baseDir = new File("E:/Other/Picture/私人/");
            IOFileFilter fullConditions 
    = new AndFileFilter(filter.unionFilters());
            filter.search(baseDir, fullConditions);
        }


        
    public void search(File baseDir, FileFilter fullConditions) {
            ImageSearcher searcher 
    = new ImageSearcher(baseDir,
                    (IOFileFilter) fullConditions);
            Thread searchThread 
    = new Thread(searcher);
            searchThread.start();

            
    try {
                searchThread.join(); 
    // child thread join to main thread
            }
     catch (InterruptedException e) {
                e.printStackTrace();
            }

            searcher.displaySearchResult();
        }


        
    // ============== Methods to construct kinds of filters ==============

        
    public void setFilePrefix(List<String> prefix) {
            prefixF 
    = new PrefixFileFilter(prefix, IOCase.SYSTEM);
        }


        
    public void setFileSuffix(List<String> suffix) {
            suffixF 
    = new SuffixFileFilter(suffix, IOCase.SYSTEM);
        }


        
    public void setFileAge(Date cutoffDate) {
            ageF 
    = new AgeFileFilter(cutoffDate);
        }


        
    public void setFileAge(Date cutoffDate, boolean acceptOlder) {
            ageF 
    = new AgeFileFilter(cutoffDate, acceptOlder);
        }


        
    public void setFileSize(long size) {
            sizeF 
    = new SizeFileFilter(size);
        }


        
    public void setFileSize(long size, boolean acceptLarger) {
            sizeF 
    = new SizeFileFilter(size, acceptLarger);
        }


        
    private List<FileFilter> unionFilters() {
            List
    <FileFilter> allFilters = new ArrayList<FileFilter>();
            allFilters.add(prefixF);
            allFilters.add(suffixF);
            allFilters.add(ageF);
            allFilters.add(sizeF);
            
    return allFilters;
        }


        
    // ============ Inner class to do search task ================

        
    class ImageSearcher extends DirectoryWalker implements Runnable {

            
    private volatile boolean cancelled = false;

            
    private File basePath;

            
    private List<String> finalResult = new ArrayList<String>();

            
    private long startTime;

            
    private long endTime;

            
    public ImageSearcher(File basePath, IOFileFilter filter) {
                
    super(FileFilterUtils.directoryFileFilter(), filter, -1);
                
    this.basePath = basePath;
            }


            
    public void run() {
                filter();
            }


            
    public void filter() {
                List
    <String> result = new ArrayList<String>();
                
    try {
                    startTime 
    = new Date().getTime();
                    walk(basePath, result);
                }
     catch (IOException e) {
                    e.printStackTrace();
                }

                endTime 
    = new Date().getTime();
                finalResult 
    = result;
            }


            
    public List<String> getResult() {
                
    return finalResult;
            }


            
    /**
             * Display search result.
             
    */

            
    public void displaySearchResult() {
                String s 
    = null;
                System.out.println(
    "\n=======================================");
                
    for (int i = 0; i < finalResult.size(); i++{
                    s 
    = (String) finalResult.get(i);
                    System.out.println(
    "  Image file found: " + s);
                }

                
    int size = finalResult.size();
                
    long elapsed = endTime - startTime;
                System.out.println(
    "\nFinally found items: " + size);
                System.out.println(
    "\nTime costing(ms) on searching: " + elapsed);
                System.out.println(
    "=======================================\n");
            }


            
    protected boolean handleDirectory(File directory, int depth,
                    Collection results) 
    throws IOException {
                
    return true;
            }


            
    protected void handleFile(File file, int depth, Collection results)
                    
    throws IOException {
                StringBuffer sb 
    = new StringBuffer(file.getAbsolutePath());
                sb.append(
    "------");
                sb.append(FileUtils.byteCountToDisplaySize(file.length()));
                results.add(sb.toString());
            }


            
    public void cancel() {
                cancelled 
    = true;
            }


            
    protected boolean handleIsCancelled(File file, int depth,
                    Collection results) 
    {
                
    return cancelled;
            }


            
    protected void handleCancelled(File startDirectory, Collection results,
                    CancelException cancel) 
    {
                
    if (cancelled) {
                    cancel();
                }

                System.out.println(
    "\nCancelled by external or interal thread");
                finalResult 
    = (List<String>) results;
            }


        }


    }


    【四】實驗結果

    這個目錄下有23個子目錄,3452張圖片

    =======================================
      ... ...

      Image file found: E:\Other\Picture\私人\2009-雕塑公園\IMG_4968.JPG------2 MB
      Image file found: E:\Other\Picture\私人\2009-雕塑公園\IMG_4977.JPG------3 MB
      Image file found: E:\Other\Picture\私人\2009-雕塑公園\IMG_4992.JPG------4 MB
      Image file found: E:\Other\Picture\私人\2009-雕塑公園\IMG_5001.JPG------3 MB
      Image file found: E:\Other\Picture\私人\2009-雕塑公園\IMG_5010.JPG------2 MB

    Finally found items: 1662

    Time costing(ms) on searching: 26125
    =======================================



    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2010-04-01 17:52 Paul Lin 閱讀(3169) 評論(1)  編輯  收藏 所屬分類: J2SE


    FeedBack:
    # re: 【Java基礎專題】IO與文件讀寫---DirectoryWalker和FileFilter的復雜條件使用
    2011-04-24 12:50 | hj-545
    鼓掌~~~  回復  更多評論
      
    <2010年4月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 青青草国产免费国产是公开| 成人久久免费网站| 亚洲色婷婷综合开心网| 三级毛片在线免费观看| 亚洲午夜成激人情在线影院| 国产精品无码一区二区三区免费 | 亚洲精品国产高清不卡在线| 巨胸喷奶水www永久免费| 亚洲成A∨人片在线观看无码| 国产一级淫片a视频免费观看| 午夜视频免费在线观看| 亚洲国产精品网站在线播放| 亚洲色成人网站WWW永久| 免费大片黄在线观看yw| 一级毛片aa高清免费观看| 亚洲国产日产无码精品| 亚洲精品一级无码鲁丝片| 91手机看片国产永久免费| 一级免费黄色毛片| 亚洲国产激情在线一区| 亚洲色精品vr一区二区三区| 美女黄网站人色视频免费国产| 岛国精品一区免费视频在线观看 | 国产午夜亚洲不卡| 成年女人午夜毛片免费视频| 中文字幕免费播放| 国产精品亚洲天堂| 亚洲AV综合色区无码二区爱AV| 亚洲无码在线播放| 免费国产怡红院在线观看| 日本三级2019在线观看免费| 在线免费观看h片| 免费人成网站永久| 亚洲日韩一中文字暮| 337p欧洲亚洲大胆艺术| 国产成人亚洲精品狼色在线| 国产免费人成视频在线观看| 欧美男同gv免费网站观看| 亚洲毛片免费观看| 日韩免费高清大片在线| 99久久国产精品免费一区二区|