您的位置:首页 > 编程语言 > Java开发

非递归遍历文件夹下指定类型的文件-Java栈实现

2015-04-22 09:58 411 查看
这几天突然想写一个非递归遍历文件夹的小例子,苦思冥想后终于出炉了。

我测试了下,递归D:/programfile(30G左右),非递归性能是 递归 的30倍,表现不错。

后来在网上也搜了下,发现网上的例子都是用list,而我想的是栈,不错,我这也算是原创了吧。

public class Main {

/**
* 遍历文件夹下指定类型的文件
* @param srcDir 源文件
* @param parten 模式,可以多个,比如".xls" ".xlsx" ".mdb",只要匹配一个就会输出
*/
public static void count(String srcDir,String... parten){

Dir root = new Dir(new File(srcDir)); //创建自定义目录

FILES_STACK.push(root); //将根目录压入栈中

while(!FILES_STACK.empty()){ //循环处理栈顶目录

Dir currentDir = FILES_STACK.peek();
if(currentDir.peekNum > 0){ //若栈顶目录之前peek过,则略过该目录(因为其子文件已全部被处理过)
FILES_STACK.pop();
continue;
}

File children[] = currentDir.dir.listFiles();

if(children == null || children.length == 0){ //若该目录是空目录,则略过该目录
FILES_STACK.pop();
continue;
}else{ //定义统计子目录数的变量
int countDir = 0;
for( File f : children){
if(f.isDirectory()) {
FILES_STACK.push(new Dir(f)); //对于子目录,不处理,直接压入栈中,然后重新执行循环
countDir++;
} else{

boolean flag = false;
for(String p : parten){ //匹配模式,只要匹配一种模式,则退出匹配

if(f.getName().endsWith(p)){
flag = true;
break;
}

}

if(flag){

// 在这里处理匹配到的文件

}

}
}

if(countDir == 0){ //如果子目录数为0,则该目录是叶子节点,将其剔出栈
FILES_STACK.pop();
continue;
}
else{ //如果子目录数不为0,则标示下该目录已经被peek过
currentDir.peekNum++;
}
}
}

}

}

class Dir {

File dir;
int peekNum;

Dir(File dir){
this.dir = dir;
this.peekNum = 0;
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: