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

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

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

      我們在開發中,經常需要遍歷一個目錄下的所有文件,常用的辦法就是使用一個函數遞歸遍歷是常用的辦法。例如:
    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 溫少的日志 閱讀(1882) 評論(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、這是深度優先的,廣度優先的實現方式會有所不同。  回復  更多評論   

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


    網站導航:
     
     
    主站蜘蛛池模板: 可以免费看黄视频的网站| 亚洲gv白嫩小受在线观看| 久久国产免费福利永久| 免费观看四虎精品成人| 亚洲日本VA午夜在线电影| 久久久久亚洲AV无码观看| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 日韩大片免费观看视频播放| 亚洲黄色片免费看| 亚洲国产精品不卡毛片a在线| 成人人免费夜夜视频观看| 2021在线永久免费视频| 久久午夜夜伦鲁鲁片免费无码| caoporm碰最新免费公开视频| 亚洲.国产.欧美一区二区三区| 激情亚洲一区国产精品| 亚洲综合综合在线| 亚洲成a人片77777老司机| 久久亚洲国产欧洲精品一| 国产亚洲老熟女视频| 亚洲人成国产精品无码| 免费看国产一级片| 国产免费久久精品| 日韩视频免费在线| 精品剧情v国产在免费线观看| 免费无码精品黄AV电影| 亚洲人成网站免费播放| 免费看黄视频网站| 97在线观免费视频观看| 青青草a免费线观a| 波多野结衣中文字幕免费视频| 最刺激黄a大片免费网站| 日本片免费观看一区二区| 精品无码免费专区毛片| 国产成人免费网站| 拍拍拍又黄又爽无挡视频免费| 噼里啪啦电影在线观看免费高清| 成人影片麻豆国产影片免费观看| 人妻视频一区二区三区免费| 午夜两性色视频免费网站| 国产免费人成在线视频|