Java 在目录中列出文件时出错
我有一个java类,用于列出给定目录的文件。它适用于只有文件而没有子目录的目录。但如果里面有一个子目录,它会给出java.lang.StackOverflower异常。下面是类和main()方法:Java 在目录中列出文件时出错,java,file,Java,File,我有一个java类,用于列出给定目录的文件。它适用于只有文件而没有子目录的目录。但如果里面有一个子目录,它会给出java.lang.StackOverflower异常。下面是类和main()方法: 封装测试; 导入java.io.File; 导入java.io.FileNotFoundException; 导入java.util.ArrayList; 导入java.util.array; 导入java.util.List; 公共类显示文件和文件夹{ 公共静态void main(字符串[]args
封装测试;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共类显示文件和文件夹{
公共静态void main(字符串[]args){
试一试{
List files=getFileList();
用于(文件:文件){
System.out.println(文件);
}
}
捕获(例外e){
e、 printStackTrace();
}
}
公共静态列表getFileList()引发FileNotFoundException{
String sPath=“C:\\Users\\owner\\Desktop\\Screen Shot\\”;
文件路径=新文件(sPath);
List fileList=new ArrayList();
File[]files=filePath.listFiles();
List fileandFolderList=Arrays.asList(文件);
对于(文件:fileandFolderList){
fileList.add(文件);
if(file.isDirectory()){
List innerFileList=getFileList();
addAll(innerFileList);
}
}
返回文件列表;
}
}
谢谢您的时间。您需要将
getFileList
搜索的根作为参数,并在每次递归时将子目录作为参数传递。(当前,在每次递归调用中,您都要从C:\Users\owner\Desktop\Screen Shot\
重新开始。)
尝试以下操作(它在我的系统上正常工作):
公共类测试{
公共静态void main(字符串[]args){
试一试{
String root=“C:\\Users\\owner\\Desktop\\Screen Shot\\”;
List files=getFileList(新文件(根));
用于(文件:文件){
System.out.println(文件);
}
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态列表getFileList(文件路径)
抛出FileNotFoundException{
List fileList=new ArrayList();
File[]files=filePath.listFiles();
List fileandFolderList=Arrays.asList(文件);
对于(文件:fileandFolderList){
fileList.add(文件);
if(file.isDirectory()){
List innerFileList=getFileList(文件);
addAll(innerFileList);
}
}
返回文件列表;
}
}
我以前实现过类似于您的方法的东西,还得到了StackOverflowException,因为我没有检查文件是否是符号链接。如果在指向目录的符号链接上调用isDirectory
,它将返回true
。因此,您将遵循符号链接,它可以指向任何地方,可能会导致无休止的树遍历,从而导致StackOverflowException。请记住,如果使用递归,则必须定义停止点。这通常由传递给递归方法的参数决定。如果您有一个不接受任何参数的递归方法,那么您可能有问题。同意!起初,我的getFileList()有一个字符串参数,但后来我认为如果我在类中添加一个main()方法,用户回答这个问题会很有帮助,从长远来看,我在递归方法中硬编码了它…:-(@aioobe既然你过去曾帮助过我,我请求你看看我的另一个问题。它与此无关。@JohnB,你也是。请看看我的另一个问题(与此无关)你能举一个“符号链接”的例子吗?.unix>man查找-s标志。当你“ls-l”时它们看起来是这样的:a-->some/other/dir/a箭头是关键。这篇文章介绍了如何在Windows中创建符号链接,以便您可以看到代码如何处理它们:@Phoenix和Oliver Weiler,您可以看看我的另一个问题(与此无关)。我需要你们的帮助。谢谢您的时间。
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;
}
}
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;
}
}