这几天突然想写一个非递归遍历文件夹的小例子,苦思冥想后终于出炉了。
我测试了下,递归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;
}
}