<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ù)的缺點就是擴展不方便,當(dāng)然你對這個函數(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 溫少的日志 閱讀(1882) 評論(2)  編輯  收藏
    Comments
    • # re: 一個FileIterator的實現(xiàn)
      kingslee
      Posted @ 2008-08-27 15:15
      State對象的聲明,有些“為了對象而對象”的味道。可以直接用ArrayList或者Stack作為存儲結(jié)構(gòu),語義更加簡明。

      遍歷大的文件目錄時,有時候深度優(yōu)先好些,有時候廣度優(yōu)先好些。上述代碼中如果推算不錯的話,應(yīng)當(dāng)是深度優(yōu)先。  回復(fù)  更多評論   
    • # 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ù)  更多評論   

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


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 国产高潮流白浆喷水免费A片 | 中文字幕天天躁日日躁狠狠躁免费| 亚洲av永久无码| 无码人妻久久一区二区三区免费| 日本h在线精品免费观看| 亚洲精品无码久久千人斩| 久久国产精品免费一区二区三区| 久久国产精品免费网站| 国产AV无码专区亚洲精品| 三年在线观看免费观看完整版中文| 免费国产成人α片| 无码欧精品亚洲日韩一区| a级特黄毛片免费观看| 国产偷v国产偷v亚洲高清| 中文字幕无码免费久久| 色播亚洲视频在线观看| 免费不卡视频一卡二卡| 国产人成亚洲第一网站在线播放| 一区二区三区免费电影| 狠狠色婷婷狠狠狠亚洲综合| aaa毛片免费观看| 亚洲国产日韩一区高清在线| 最近中文字幕mv免费高清视频8 | 中文字幕久无码免费久久 | 亚洲精品视频免费看| 亚洲成人免费在线观看| 成人au免费视频影院| 深夜特黄a级毛片免费播放| 亚洲精品视频免费观看| 久久精品无码精品免费专区| 亚洲国产精品久久网午夜| 黄a大片av永久免费| 成人毛片100免费观看| 亚洲综合国产精品| 成人最新午夜免费视频| 国产免费区在线观看十分钟| 亚洲最大视频网站| 亚洲VA综合VA国产产VA中| 国产精品99精品久久免费| 亚洲精品精华液一区二区| 国外亚洲成AV人片在线观看|