我的程序将计算机(OS Ubuntu)上文件的所有路径收集到一个Map。Map中的键是文件大小,值是文件的规范路径列表,大小等于键。
Map<Long, ArrayList<String>> map = new HashMap<>(100000);
计算机上的文件总数为:281091
一种收集文件的方法,它是递归的。
private void scanner(String path) throws Exception {
File[] dirs = new File(path).listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
if (file.isFile() && file.canRead()) {
long size = file.length();
String canonPath = file.getCanonicalPath();
if (map.containsKey(size))
map.get(size).add(canonPath);
else map.put(size, new ArrayList<>(Arrays.asList(canonPath)));
return false;
}
return file.isDirectory() && file.canRead();
}
});
for (File dir : dirs) {
scanner(dir.getCanonicalPath());
}
}
当我开始从根文件夹“/”开始扫描时,出现异常:
Exception in thread "main" java.lang.StackOverflowError
at java.io.UnixFileSystem.canonicalize0(Native Method)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:172)
at java.io.File.getCanonicalPath(File.java:589)
at taskB.FileScanner.setCanonPath(FileScanner.java:49)
at taskB.FileScanner.access$000(FileScanner.java:12)
at taskB.FileScanner$1.accept(FileScanner.java:93)
at java.io.File.listFiles(File.java:1217)
at taskB.FileScanner.scanner(FileScanner.java:85)
at taskB.FileScanner.scanner(FileScanner.java:109)
at taskB.FileScanner.scanner(FileScanner.java:109)
...
但为了测试,我填写了目录“~/Documents”超过400 ~ 千个文件并开始从中扫描。一切正常。
为什么当程序从根目录“/”开始时,少了30万个文件我有异常?我应该怎么做才能防止这种情况发生?