如何遍历文件夹下上亿文件而不溢出(转载)

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

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

新浪微博:intsmaze刘洋洋哥

微信:intsmaze

  说实话这个问题我以前也没有遇到过,我是听一位我很敬佩的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);
         }
    }
}
时间: 2024-10-03 14:56:13

如何遍历文件夹下上亿文件而不溢出(转载)的相关文章

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

序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反复调用会导致方法一直无法释放,造成jvm的栈溢出.那我们该怎么办? 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6031894.html 新浪微博:intsmaze刘洋洋哥 微信:intsmaze 说实话这个问题我以前也没有遇到过,我是听一位我很敬佩的IT前辈讲的他曾经的面试经历.他说他当时比较

Java遍历一个文件夹下的全部文件

Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其它流类不同的是,流类关心的是文件的内容.而File类关心的是磁盘上文件的存储. 一,File类有多个构造器,经常使用的构造器有: 1.public File(String pathname){} 在pathname路径下创建文件对象 2.public File(String path,String name){} 在path參数指定的文件夹中创建具有给定名字的File对象.假设path为null,构造器将使用

遍历一个文件夹下的所有文件

一个老问题,但是总有人爱问,遍历一个文件夹下的所有文件,并输出文件信息. using System; using System.Collections.Generic; using System.ComponentModel;using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace IOTest { public partial class For

Java遍历文件夹下的所以文件

利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重命名操作 1 package com.zhang.test; 2 3 import java.io.File; 4 5 public class getfilepath { 6 7 public static void main(String[] args) { 8 getDirectory(new

cocos2d-x 如何读取遍历文件夹下的所有文件 (简单明了/童少无欺)

比如我要遍历Resources/music下面所有的文件 导入头文件 #include <sys/stat.h> #include "dirent.h" #include "unistd.h" 实现代码 std::string filePath = FileUtils::getInstance()->fullPathForFilename("music"); CCLOG("%s",filePath.c_str

JAVA 遍历文件夹下的所有文件

JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = 0, folderNum = 0; File file = new File(path); if (file.exists()) { LinkedList<File> list = new LinkedList<File>(); File[] files = file.listFile

C/C++遍历Windows文件夹下的所有文件

因为文件夹中往往包含文件和文件夹.想要遍历所有的文件,必须遍历文件夹中所有的文件夹.很显然,这个描述满足递归的两个要素:(1)问题的规模在不断的缩小,且新问题的模式与旧问题相同.很显然文件夹中含有子文件夹同样需要遍历.(2)含有简单的终止条件,即遇到文件夹下再无文件夹停止. C++遍历文件夹下所有文件如下: int osmgpxPaser::GetAllgpxFilepathFromfolder(char* Path) { char szFind[MAX_PATH]; WIN32_FIND_DA

如何遍历文件夹下的所有文件

如何遍历文件夹下的所有文件 1 public class Test { 2 public static void main(String[] args) { 3 File file=new File("文件对象的路径"); 4 Check(file); 5 } 6 /** 7 * 递归调用 8 * @param file 显示该目录下所有文件 9 */ 10 public static void Check(File file){ 11 if (file.isDirectory())

linux查找文件夹下的全部文件里是否含有某个字符串

查找文件夹下的全部文件里是否含有某个字符串 find .|xargs grep -ri "IBM" 查找文件夹下的全部文件里是否含有某个字符串,而且仅仅打印出文件名称 find .|xargs grep -ri "IBM" -l 1.正則表達式 (1)正則表達式一般用来描写叙述文本模式的特殊使用方法,由普通字符(比如字符a-z)以及特殊字符(称为元字符.如/.*.?等)组成. (2)基本元字符集及其含义 ^ :仅仅匹配行首. 如^a 匹配以a开头的行abc,a2e,