前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何遍历文件夹下上亿文件而不栈溢出

如何遍历文件夹下上亿文件而不栈溢出

作者头像
intsmaze-刘洋
发布2018-10-08 11:13:24
5550
发布2018-10-08 11:13:24
举报

序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反复调用会导致方法一直无法释放,造成jvm的栈溢出。那我们该怎么办?

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6031894.html

  说实话这个问题我以前也没有遇到过,我是听一位我很敬佩的IT前辈讲的他曾经的面试经历。他说他当时比较紧张就想到了递归,没有想到其他的方案。

  当然他跟我说这个问题的时候,它也没有想到好的处理方案。它认为这种情况可以参考网络爬虫的递归,为了防止爬虫在一个深度出不来,通常会设置每一次爬的深度,然后通过各种的限制条件来保证每一个文件都被访问到。

  当时我灵光一闪,因为当时我在温故数据结构的知识,我说这个文件夹的层次看着好呀嘛好眼熟,不就相当于一个树的结构,那我们学数据结构的时候是如何遍历节点的。有左递归,中递归,右递归,当然这就是上面的递归方法,不是我们要找的解决方案,那么该怎么办?

看,角落里有我们经常忽视的层序遍历。

层序遍历:层序遍历就是从所在树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

代码思路:

我们只需要使用一个list集合来存储每一个文件(夹),然后按次序读取list集合的元素,并判断如果是文件夹则把该文件夹下的所有文件(夹)追加到list集合后面,然后读取list的下一个元素以此类推。

public class demo {
    public static void main(String[] args) {
        List<File> list=new ArrayList<File>();
        File file = new File("C:/intsmaze");
        list.add(file);
         for(int i=0;i<list.size();i++)
         {
             if(list.get(i).isDirectory())
             {
                 File[] tempList = list.get(i).listFiles();
                 for(int j=0;j<tempList.length;j++)
                 {
                     list.add(tempList[j]);
                 }
             }
         }
        
    }
}

都是有经验的开发人员,上面的代码就没有必要进行注释了。

当然有人会较真,当文件数量很多,就算这代码可以保证栈不溢出,但是list集合数量上去了,堆也会爆的。

当然,这是一种情况,其实也很简单,每从集合读取一个元素,就把该元素从集合溢出,存入硬盘中即可,然后循环里面的判断条件中不对i进行递增即可。

public class demo {
    public static void main(String[] args) {
        List<File> list=new ArrayList<File>();
        File file = new File("C:/intsmaze");
        list.add(file);
         for(int i=0;i<list.size();)
         {
             if(list.get(i).isDirectory())
             {
                 File[] tempList = list.get(i).listFiles();
                 for(int j=0;j<tempList.length;j++)
                 {
                     list.add(tempList[j]);
                 }
             }
             list.remove(i);
         }
    }
}

大家有更好的解决方案可以一起分享讨论.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码思路:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档