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

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

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

      我們在開發(fā)中,經(jīng)常需要遍歷一個(gè)目錄下的所有文件,常用的辦法就是使用一個(gè)函數(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ù)的缺點(diǎn)就是擴(kuò)展不方便,當(dāng)然你對這個(gè)函數(shù)加入一個(gè)參數(shù)FileHandler,這樣擴(kuò)展性稍好一些,但是仍然不夠好,比如說,不能根據(jù)遍歷的 需要中途停止遍歷,加入Filter等等。我實(shí)現(xiàn)了一個(gè)FileIterator,使得遍歷一個(gè)目錄下的文件如何遍歷一個(gè)集合中的元素一般操作。

    廢話少說,代碼如下:
    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 溫少的日志 閱讀(1884) 評論(2)  編輯  收藏
    Comments
    • # re: 一個(gè)FileIterator的實(shí)現(xiàn)
      kingslee
      Posted @ 2008-08-27 15:15
      State對象的聲明,有些“為了對象而對象”的味道。可以直接用ArrayList或者Stack作為存儲(chǔ)結(jié)構(gòu),語義更加簡明。

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

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


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 亚洲欧洲精品视频在线观看| 亚洲AV男人的天堂在线观看| 一个人免费日韩不卡视频| 亚洲AV日韩AV永久无码久久| 24小时日本在线www免费的| 羞羞视频网站免费入口| 亚洲va无码va在线va天堂| 毛片基地免费视频a| 中文字幕免费在线观看动作大片| 亚洲第一成年网站大全亚洲| 亚洲AV无码乱码精品国产| 在线免费中文字幕| 国产AV无码专区亚洲AV琪琪 | 国产av无码专区亚洲av果冻传媒| 三年片在线观看免费观看大全动漫 | 日韩国产欧美亚洲v片| 亚洲Av熟妇高潮30p| 免费一级毛片在线播放不收费| 99久久综合精品免费| 人成午夜免费大片在线观看| 黄色一级视频免费观看| 亚洲黄色高清视频| 久久久久亚洲AV成人网人人软件| 91在线视频免费91| 无码日韩精品一区二区三区免费| 国产综合激情在线亚洲第一页 | 巨胸喷奶水视频www免费视频| 亚洲中文字幕无码一去台湾| 亚洲av伊人久久综合密臀性色| 在线永久免费观看黄网站| 四虎1515hh永久久免费| 国产做国产爱免费视频| 国产尤物在线视精品在亚洲| 亚洲av永久综合在线观看尤物 | 免费的黄网站男人的天堂| 亚洲v国产v天堂a无码久久| 免费观看AV片在线播放| 亚洲免费精彩视频在线观看| 国产精品无码免费专区午夜| 国产亚洲美女精品久久| 亚洲依依成人亚洲社区|