私のプログラムは、コンピューター (OS Ubuntu) 上のファイルへのすべてのパスを 1 つの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 ~ 1000 個以上のファイルを入力し、そこからスキャンを開始しました。すべて正常に動作します。
プログラムが 30 万ファイル未満のルート ディレクトリ "/" から起動すると例外が発生するのはなぜですか? これを防ぐにはどうすればよいですか?