我试图递归地遍历我的驱动器来搜索一些文件。当有有限的文件夹/文件时,代码运行良好,但是当我搜索C驱动器时,它会抛出堆内存中的大量文件。
线程" thread -4“中的异常java.lang.OutOfMemoryError: Java堆空间
我不想增加最大允许的堆空间,因为这就像暂时推迟这个问题一样。
代码:
void iterateDirectory(String somedir) {
File dir = new File(somedir);
File[] files = dir.listFiles();
if (files != null) {
for (int id = 0; id < files.length; id++) {
if (files[id].isDirectory() == false)
{
fsTree.add(files[id].toString()); // taking list of files
}
else
{
iterateFilesInDirectory(files[id].getAbsolutePath());
}
}
}
}发布于 2012-05-18 15:01:40
对于递归可以做什么有一些限制,即与堆栈/堆的使用有关。记住,无论递归地做什么,都可以迭代完成;重写代码来使用迭代解决方案。
替代解决方案:java.nio中有一个接口,可用于递归遍历文件系统的结构。看看这条小径和SimpleFileVisitor。
发布于 2012-05-18 15:37:44
在我看来,罪魁祸首是这条线:
fsTree.add(files[id].toString()); // taking list of files似乎将每个文件添加到全局数据结构(fsTree)中,然后在那里搜索。
我打赌:
答:如果你把递归函数“转换”成迭代函数,它就不会消失。
B.如果您在本地进行搜索/匹配,并且只在全局缓存匹配命中,而不是追加到全局数据结构和搜索,它就会消失:
void iterateDirectory (String somedir, String search_term) {
File dir = new File(somedir);
File[] files = dir.listFiles();
if (files != null) {
for (int id = 0; id < files.length; id++) {
if (files[id].isDirectory() == false)
{
if (/* files[id].isDirectory() MATCHES search_term */)
// add to list of matching files:
matching_hits.add(files[id].toString());
}
else
{
iterateFilesInDirectory(files[id].getAbsolutePath());
}
}
}
}发布于 2012-05-18 15:03:25
有两种可能性:
.和/或.. )。如果是这样的话,你必须修复代码。-Xmx JVM选项来增加堆大小。
https://stackoverflow.com/questions/10654980
复制相似问题