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

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

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

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

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

        
    // do something 
    }


    但是遞歸函數(shù)的缺點就是擴展不方便,當然你對這個函數(shù)加入一個參數(shù)FileHandler,這樣擴展性稍好一些,但是仍然不夠好,比如說,不能根據(jù)遍歷的 需要中途停止遍歷,加入Filter等等。我實現(xiàn)了一個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 溫少的日志 閱讀(1883) 評論(2)  編輯  收藏
    Comments
    • # re: 一個FileIterator的實現(xiàn)
      kingslee
      Posted @ 2008-08-27 15:15
      State對象的聲明,有些“為了對象而對象”的味道??梢灾苯佑肁rrayList或者Stack作為存儲結構,語義更加簡明。

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

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


    網(wǎng)站導航:
     
     
    主站蜘蛛池模板: 久久免费区一区二区三波多野| eeuss影院www天堂免费| 香港a毛片免费观看| 亚洲午夜国产精品无码| 国产va免费精品| 亚洲无av在线中文字幕| www免费黄色网| 亚洲熟妇中文字幕五十中出| 久草免费福利在线| 亚洲狠狠婷婷综合久久久久| 在线观看黄片免费入口不卡| 亚洲成a人片在线观看日本| 久久亚洲免费视频| 亚洲欧洲校园自拍都市| 久久久久久国产精品免费免费| 国产亚洲玖玖玖在线观看| 日本免费v片一二三区| 国产精品亚洲一区二区三区在线观看| 四虎影视永久免费观看地址| 成人一级免费视频| 亚洲av午夜福利精品一区人妖| 99re6在线精品视频免费播放| 亚洲无砖砖区免费| 看全色黄大色大片免费久久| 暖暖免费中文在线日本| 国产亚洲精品一品区99热| 成人免费黄色网址| 337p日本欧洲亚洲大胆人人| 国内精品久久久久久久亚洲| 免费人成在线观看网站品爱网| 亚洲一级毛片免费看| 国产91在线免费| 国产免费爽爽视频在线观看| 免费在线观看一区| 亚洲精品国产字幕久久不卡| aⅴ在线免费观看| 九九精品国产亚洲AV日韩| 亚洲色精品vr一区二区三区| 中文字幕免费视频| 国产综合激情在线亚洲第一页| 亚洲成亚洲乱码一二三四区软件|