我們在開發中,經常需要遍歷一個目錄下的所有文件,常用的辦法就是使用一個函數遞歸遍歷是常用的辦法。例如:
          public static void iterateFile(File file) {
              
          if (file.isDirectory()) {
                  
          if (file.getName().startsWith(".")) return;

                  
          for (File item : file.listFiles()) {
                      iterateFile(item);
                  }
                  
          return;
              }

              
          // do something 
          }


          但是遞歸函數的缺點就是擴展不方便,當然你對這個函數加入一個參數FileHandler,這樣擴展性稍好一些,但是仍然不夠好,比如說,不能根據遍歷的 需要中途停止遍歷,加入Filter等等。我實現了一個FileIterator,使得遍歷一個目錄下的文件如何遍歷一個集合中的元素一般操作。

          廢話少說,代碼如下:
          package net.wenshao;

          import java.io.File;
          import java.util.Iterator;
          import java.util.NoSuchElementException;

          public class FileIterator implements Iterator<File> {
              
          private static class State {
                  
          final State parent;
                  
          final File[] files;

                  
          int index = 0;

                  
          public State(State parent, File dir) {
                      
          this.parent = parent;
                      files 
          = dir.listFiles();
                  }
              }

              
          private File current;

              
          private State state;

              
          public FileIterator(File file) {
                  
          if (file.isDirectory()) {
                      state 
          = new State(null, file);
                      nextInternal();
                  } 
          else {
                      
          this.current = file;
                      state 
          = null;
                  }
              }

              @Override
              
          public boolean hasNext() {
                  
          return current != null;
              }

              @Override
              
          public File next() {
                  File rtValue 
          = current;

                  
          if (rtValue == nullthrow new NoSuchElementException();

                  nextInternal();

                  
          return rtValue;
              }

              
          private void nextInternal() {
                  current 
          = null;

                  
          if (this.state == nullreturn;

                  
          for (;;) {
                      
          if (state.index >= state.files.length) {
                          state 
          = state.parent;
                          
          if (state == null) return;
                          state.index
          ++;
                          
          continue;
                      }

                      File file 
          = state.files[state.index];
                      
                      
          // 可以在此處加入Filters處理代碼
                      
                      
          if (file.isDirectory()) {
                          state 
          = new State(state, file);
                          
          continue;
                      }

                      current 
          = file;
                      state.index
          ++;
                      
          break;
                  }
              }

              @Override
              
          public void remove() {
                  
          throw new UnsupportedOperationException();
              }
          }

          使用FileIterator的例子:
          File dir = new File("/home/wenshao/workspace");

          Iterator
          <File> iter = new FileIterator(dir);
          while (iter.hasNext()) {
              File file 
          = iter.next();
              System.out.println(file.getPath());
          }

          posted on 2008-06-05 07:56 溫少的日志 閱讀(1902) 評論(2)  編輯  收藏
          Comments
          • # re: 一個FileIterator的實現
            kingslee
            Posted @ 2008-08-27 15:15
            State對象的聲明,有些“為了對象而對象”的味道。可以直接用ArrayList或者Stack作為存儲結構,語義更加簡明。

            遍歷大的文件目錄時,有時候深度優先好些,有時候廣度優先好些。上述代碼中如果推算不錯的話,應當是深度優先。  回復  更多評論   
          • # re: 一個FileIterator的實現
            溫少的日志
            Posted @ 2008-08-30 16:12
            回kingslee
            1、State有三個field,parent、index和files,不聲明一個對象,使用ArrayList不好,聲明一個對象語義更明確。
            2、這是深度優先的,廣度優先的實現方式會有所不同。  回復  更多評論   

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          主站蜘蛛池模板: 佛坪县| 诸城市| 巴塘县| 正宁县| 西乡县| 聂拉木县| 商水县| 台州市| 巩留县| 洪雅县| 呼伦贝尔市| 青川县| 贡嘎县| 太和县| 东兰县| 志丹县| 房产| 衢州市| 仪陇县| 孝感市| 孟州市| 缙云县| 崇礼县| 灵台县| 高台县| 仁怀市| 红安县| 湖州市| 吉林市| 高邑县| 宣汉县| 亳州市| 家居| 遂宁市| 霍州市| 西林县| 榆社县| 砀山县| 屏南县| 义乌市| 元阳县|