我正在尝试以递归方式遍历我的云端硬盘以搜索某些文件。 当有限的文件夹/文件时,代码工作正常,但是当我将搜索目标定位到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());
}
}
}
}
答案 0 :(得分:2)
罪魁祸首,正如我所看到的那样:
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());
}
}
}
}
答案 1 :(得分:1)
有两种可能性:
.
和/或..
。如果是这种情况,则必须修复代码。-Xmx
JVM选项来增加堆大小。答案 2 :(得分:-1)
递归可以做什么,即堆栈/堆使用方面存在限制。请记住,无论你以递归方式做什么,你都可以迭代地做;重写代码以改为使用迭代解决方案。
备用解决方案:java.nio
中有一个接口,可用于递归地向下走文件系统的结构。请查看this trail和SimpleFileVisitor
。