2 skyshuai1 skyshuai1 于 2015.06.19 16:01 提问

递归一个文件夹下所有文件以及文件夹,造成栈内存溢出,求解决

我需要递归一个文件夹下所有的文件并进行操纵,文件夹下也有文件夹,我用一个list存储递归得到的所有文件可能会造成溢出。我需要当此list为10000时候执行,然后清空list,请问如何实现。代码如下:
static void getFiles(String filePath){
File root = new File(filePath);
File[] files = root.listFiles();
for(File file:files){
if(file.isDirectory()){//是否为文件夹
getFiles(file.getAbsolutePath());
filelist.add(file.getAbsolutePath());//filelist是ArrayList,用来存储所有文件路径;
}else{
//对文件的操作;

请问我改如何修改才能让程序在flielist大小每当10000执行一次,然后在将其清空,继续执行,不至于让filelist太大从而解决内存溢出问题。本人线程比较菜,求大神帮忙。最好能在此代码上修改。

3个回答

bdmh
bdmh   Ds   Rxr 2015.06.19 16:17

你确认是list的容量问题吗,也许是你这个递归无法结束,导致溢出,如果想清空list,那就在每次进入这个递归时判断数量,然后清空,不过这样做危险很多,中途改变数量,可能导致入栈的操作或后续的操作出问题

u010289866
u010289866   2015.06.19 16:48

既然内存很宝贵的话,就不要用List了。每次调用 File.listFiles()之后将得到的数据持久化,存进文件或者数据库什么的比较好。这样,只要你各层目录中的项目数目小于10000就可以。
空间资源有限的情况下,整个过程最好分两步走,一是先持久化所有的文件夹,第二再考虑枚举每一个文件夹,对其中的文件进行除了。
楼主代码中的if...else...结构很难适应内存空间有限的情况。

yenange
yenange   2015.06.19 22:52

https://msdn.microsoft.com/zh-cn/library/dd383571.aspx

Directory.EnumerateFiles 方法 (String, String, SearchOption)
返回指定路径中与搜索模式匹配的文件名称的可枚举集合,还可以搜索子目录。

用这个, 直接返回所有文件, 就不需要再递什么归了, 递归是性能低下之源。

Csdn user default icon
上传中...
上传图片
插入图片