Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在目录中列出文件时出错_Java_File - Fatal编程技术网

Java 在目录中列出文件时出错

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类,用于列出给定目录的文件。它适用于只有文件而没有子目录的目录。但如果里面有一个子目录,它会给出java.lang.StackOverflower异常。下面是类和main()方法:

封装测试;
导入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;
    }
}