posts - 262,  comments - 221,  trackbacks - 0
          【一】DirectoryWalker介紹

          在日常的操作中,我們經常需要對某個目錄下的資源進行遍歷。比如說:遍歷工程目錄,找出所有.svn的目錄并進行刪除。這時我們如果使用前面的File filter,將不能做到遞歸的效果。于是Apache commons IO提供了一個用于遍歷目錄進行操作的抽象類:DirectoryWalker。

          Abstract class that walks through a directory hierarchy and provides subclasses with convenient hooks to add specific behaviour.

          This class operates with a FileFilter and maximum depth to limit the files and direcories visited. Commons IO supplies many common filter implementations in the filefilter package.

          【二】DirectoryWalker實戰

          在這個類的API中,作者演示了如何使用這個類來刪除指定目錄下的所有文件和.svn目錄,并返回已刪除的文件

          public class FileCleaner extends DirectoryWalker {

           
          public FileCleaner() {
                
          super();
              }


           
          public List clean(File startDirectory) {
                List results 
          = new ArrayList();
                walk(startDirectory, results);
                
          return results;
              }


              
          protected boolean handleDirectory(File directory, int depth, Collection results) {
                
          // delete svn directories and then skip
                if (".svn".equals(directory.getName())) {
                    directory.delete();
                   
          return false;
                }
           else {
                   
          return true;
                }


              }


              
          protected void handleFile(File file, int depth, Collection results) {
                
          // delete file and add to list of deleted
                  file.delete();
                  results.add(file);
              }

            }

          要使用DirectoryWalker來遍歷一個目錄并進行相應的操作,步驟如下:

          ①創建一個繼續于DirectoryWalker的類,并在構造方法中調用super();
          ②定義一個業務入口方法,例如clean。在這個方法中調用walk方法
          ③覆蓋DirectoryWalker類的handleDirectory方法,提供相應的處理邏輯
          ④覆蓋DirectoryWalker類的handleFile方法,提供相應的處理邏輯

          其中的關鍵在于walk方法,這個方法指定了入口的路徑,并提供一個用于接收處理結果的參數。在這個方法的內部,它遞歸地對每一個目錄對象調用handleDirectory方法,對于每一個文件對象調用handleFile方法。

          private void walk(File directory, int depth, Collection results) throws IOException {
                  checkIfCancelled(directory, depth, results);
                  
          if (handleDirectory(directory, depth, results)) {
                      handleDirectoryStart(directory, depth, results);
                      
          int childDepth = depth + 1;
                      
          if (depthLimit < 0 || childDepth <= depthLimit) {
                          checkIfCancelled(directory, depth, results);
                          File[] childFiles 
          = (filter == null ? directory.listFiles() : directory.listFiles(filter));
                          
          if (childFiles == null{
                              handleRestricted(directory, childDepth, results);
                          }
           else {
                              
          for (int i = 0; i < childFiles.length; i++{
                                  File childFile 
          = childFiles[i];
                                  
          if (childFile.isDirectory()) {
                                      walk(childFile, childDepth, results);
                                  }
           else {
                                      checkIfCancelled(childFile, childDepth, results);
                                      handleFile(childFile, childDepth, results);
                                      checkIfCancelled(childFile, childDepth, results);
                                  }

                              }

                          }

                      }

                      handleDirectoryEnd(directory, depth, results);
                  }

                  checkIfCancelled(directory, depth, results);
              }


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


          FeedBack:
          # re: 【Java基礎專題】IO與文件讀寫---使用Apache commons IO包進行資源遍歷
          2010-03-11 14:48 | swinging
          super()會被子類自動調用,不一定要顯示表示  回復  更多評論
            
          <2010年3月>
          28123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 广州市| 平凉市| 武清区| 罗山县| 永昌县| 巫溪县| 新郑市| 南皮县| 蒙自县| 麻阳| 手机| 洪洞县| 廊坊市| 天祝| 阿勒泰市| 永胜县| 中江县| 广东省| 马鞍山市| 靖宇县| 朝阳县| 中超| 固始县| 四子王旗| 西充县| 扎兰屯市| 富锦市| 绥德县| 铜陵市| 石嘴山市| 莱州市| 花莲县| 枣阳市| 旬阳县| 启东市| 怀化市| 泸西县| 竹北市| 托克逊县| 兴隆县| 衡阳市|