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 閱讀(3172) 評論(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熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 孟津县| 米泉市| 比如县| 临湘市| 双流县| 达州市| 天全县| 宽甸| 哈尔滨市| 泰宁县| 丰都县| 乌苏市| 突泉县| 嵩明县| 桑日县| 和硕县| 兴和县| 罗田县| 名山县| 铜鼓县| 清镇市| 武夷山市| 湖北省| 镇江市| 华安县| 华亭县| 宕昌县| 甘谷县| 松滋市| 宜良县| 缙云县| 呼伦贝尔市| 太原市| 洱源县| 合川市| 林甸县| 湘潭县| 吴忠市| 分宜县| 海伦市| 浦江县|