我如何递归地列出在Java目录下的所有文件?框架是否提供任何实用程序?

我看到了很多俗气的实现。但没有来自框架或nio


当前回答

FileUtils有iterateFiles和listFiles方法。试一试吧。(从commons-io)

编辑:您可以在这里查看不同方法的基准测试。common -io方法似乎很慢,所以从这里选择一些更快的方法(如果重要的话)

其他回答

我的建议是:

public void list(File file) {
    System.out.println(file.getName());
    File[] children = file.listFiles();
    for (File child : children) {
        list(child);
    }
}

System.out.println只是用来指示对该文件执行一些操作。没有必要区分文件和目录,因为一个正常的文件只会有零个子文件。

public static String getExten(String path) {
    int i = path.lastIndexOf('.');
    if (i > 0) {
       return path.substring(i);
    }
    else return "";
}
public static List<String> GetAllFiles(String path, List<String>fileList){
    File file = new File(path);
    
    File[] files = file.listFiles();
    for(File folder:files) {
        if(extensions.contains(getExten(folder.getPath()))) {
            fileList.add(folder.getPath());
        }
    }
    File[] direcs = file.listFiles(File::isDirectory);
    for(File dir:direcs) {
        GetAllFiles(dir.getPath(),fileList);
    }
    return fileList;
    
}

这是一个简单的递归函数,应该会提供所有文件。Extensions是一个字符串列表,它只包含那些被接受的扩展名。例如扩展名= [".txt",".docx"]等。

您可以使用下面的代码来递归地获得特定文件夹或目录的文件列表。

public static void main(String args[]) {

        recusiveList("D:");

    }

    public static void recursiveList(String path) {

        File f = new File(path);
        File[] fl = f.listFiles();
        for (int i = 0; i < fl.length; i++) {
            if (fl[i].isDirectory() && !fl[i].isHidden()) {
                System.out.println(fl[i].getAbsolutePath());
                recusiveList(fl[i].getAbsolutePath());
            } else {
                System.out.println(fl[i].getName());
            }
        }
    }

我认为这应该是可行的:

File dir = new File(dirname);
String[] files = dir.list();

这样你就有文件和dirs了。现在使用递归并对dirs(文件类具有isDirectory()方法)执行相同的操作。

List<Path> filePaths = Files
    .find(Paths.get(dir), Integer.MAX_VALUE, (filePath, fileAttr) -> fileAttr.isRegularFile() || fileAttr.isDirectory())
    .collect(Collectors.toList());

fileppaths将有文件和文件夹列表,可以迭代并进一步进行。