序:一个文件夹下面有不少层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在通常状况确实是比较方便的解决方案,可是当文件夹深度多深,递归的反复调用会致使方法一直没法释放,形成jvm的栈溢出。那咱们该怎么办?html
原文和做者一块儿讨论:http://www.cnblogs.com/intsmaze/p/6031894.html
面试
说实话这个问题我之前也没有遇到过,我是听一位我很敬佩的IT前辈讲的他曾经的面试经历。他说他当时比较紧张就想到了递归,没有想到其余的方案。网络
固然他跟我说这个问题的时候,它也没有想到好的处理方案。它认为这种状况能够参考网络爬虫的递归,为了防止爬虫在一个深度出不来,一般会设置每一次爬的深度,而后经过各类的限制条件来保证每个文件都被访问到。数据结构
当时我灵光一闪,由于当时我在温故数据结构的知识,我说这个文件夹的层次看着好呀嘛好眼熟,不就至关于一个树的结构,那咱们学数据结构的时候是如何遍历节点的。有左递归,中递归,右递归,固然这就是上面的递归方法,不是咱们要找的解决方案,那么该怎么办?jvm
看,角落里有咱们常常忽视的层序遍历。spa
层序遍历:层序遍历就是从所在树的根节点出发,首先访问第一层的树根节点,而后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。code
咱们只须要使用一个list集合来存储每个文件(夹),而后按次序读取list集合的元素,并判断若是是文件夹则把该文件夹下的全部文件(夹)追加到list集合后面,而后读取list的下一个元素以此类推。htm
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]); } } } } }
都是有经验的开发人员,上面的代码就没有必要进行注释了。blog
固然有人会较真,当文件数量不少,就算这代码能够保证栈不溢出,可是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); } } }
你们有更好的解决方案能够一块儿分享讨论.