我有一个java类,用于列出给定目录的文件。它只适用于只有文件且没有子目录的目录。但是如果里面有一个子目录,它会给出java.lang.StackOverflowError异常。这是与main()方法一起使用的类:
package test;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DisplayFilesAndFolders {
public static void main(String[] args) {
try {
List<File> files = getFileList();
for(File file : files ){
System.out.println(file);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
public static List<File> getFileList() throws FileNotFoundException{
String sPath = "C:\\Users\\owner\\Desktop\\Screen Shot\\";
File filePath = new File(sPath);
List<File> fileList = new ArrayList<File>();
File[] files = filePath.listFiles();
List<File> fileandFolderList = Arrays.asList(files);
for (File file : fileandFolderList) {
fileList.add(file);
if (file.isDirectory()) {
List<File> innerFileList = getFileList();
fileList.addAll(innerFileList);
}
}
return fileList;
}
}
感谢您的时间。
答案 0 :(得分:4)
您需要将getFileList
搜索的根目录作为参数,并在每次递归时将子目录作为参数传递。 (目前,您在每次递归调用时都会从C:\Users\owner\Desktop\Screen Shot\
开始。)
尝试以下操作(它在我的系统上按预期工作):
public class Test {
public static void main(String[] args) {
try {
String root = "C:\\Users\\owner\\Desktop\\Screen Shot\\";
List<File> files = getFileList(new File(root));
for(File file : files ){
System.out.println(file);
}
} catch(Exception e) {
e.printStackTrace();
}
}
public static List<File> getFileList(File filePath)
throws FileNotFoundException{
List<File> fileList = new ArrayList<File>();
File[] files = filePath.listFiles();
List<File> fileandFolderList = Arrays.asList(files);
for (File file : fileandFolderList) {
fileList.add(file);
if (file.isDirectory()) {
List<File> innerFileList = getFileList(file);
fileList.addAll(innerFileList);
}
}
return fileList;
}
}
答案 1 :(得分:1)
我之前已经实现了类似你的方法,并且还得到了StackOverflowException,因为我没有检查File是否是符号链接。如果您在指向目录的符号链接上调用isDirectory
,它将返回true
。因此,您将遵循符号链接,它可以指向任何地方,可能导致无休止的树遍历,从而导致StackOverflowException。