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

这几天突然想写一个非递归遍历文件夹的小例子,苦思冥想后终于出炉了。

我测试了下,递归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;
    }

}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值