<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、這是深度優先的,廣度優先的實現方式會有所不同。  回復  更多評論   

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


    網站導航:
     
     
    主站蜘蛛池模板: 免费精品国产自产拍在线观看图片| 九九热久久免费视频| 外国成人网在线观看免费视频| 亚洲女同成av人片在线观看 | 成人亚洲综合天堂| 亚洲色在线无码国产精品不卡| 国产成在线观看免费视频| 亚洲精品美女在线观看| 99在线免费观看视频| 18gay台湾男同亚洲男同| 2019中文字幕在线电影免费| 亚洲网站在线免费观看| 国产免费的野战视频| 亚洲中文无码亚洲人成影院| 暖暖免费高清日本中文| 国产成人亚洲精品电影| 亚洲福利中文字幕在线网址| www免费黄色网| 亚洲国产成人久久精品动漫 | 免费人成大片在线观看播放电影| 国产精品无码素人福利免费| 免费一级毛片在线播放放视频| 国产亚洲精品久久久久秋霞| 嫩草在线视频www免费观看| 久久久久久亚洲Av无码精品专口| 青青草a免费线观a| 国产亚洲蜜芽精品久久| 亚洲精品视频在线看| 午夜精品射精入后重之免费观看| 亚洲一区电影在线观看| 国产一级淫片免费播放电影| 91av免费在线视频| 亚洲六月丁香六月婷婷色伊人| 国产免费久久精品久久久| a毛片全部免费播放| 亚洲国产成人手机在线电影bd| 国产猛烈高潮尖叫视频免费| 大地资源网高清在线观看免费| 亚洲人成黄网在线观看| 亚洲性在线看高清h片| 最近免费中文字幕高清大全|