将所有文件以递归方式保存在列表

时间:2015-07-01 12:00:09

标签: java file recursion

我有一个方法,它以String参数作为根目录,我想为所有子文件夹保存文件的名称和路径。

FileObject只是一个包含两个String变量的类 - namepath

private static List<FileObject> getAllFilePaths(String rootDir, List<FileObject> helper) {
    File directory = new File(rootDir);
    System.out.println("rootDir: "+rootDir);
    FileObject fo=new FileObject();
    //get all files and directories
    File[] allFiles = directory.listFiles();
    for (File file : allFiles) {
        if (file.isFile()) {
            System.out.println("If file: "+file.getName());
            //if it's a file add it to results
            fo.setPath(file.getAbsolutePath());
            fo.setName(file.getName());
            helper.add(fo);
        } else if (file.isDirectory()) {
            System.out.println("else if: "+file.getName());
            //is it's a directory do the method again and add to to results
            //fo.setPath(file.getAbsolutePath());
            //fo.setName(file.getName());
            //results.add(fo);
            getAllFilePaths(file.getAbsolutePath(),helper);
        }
    }
    return helper;
}

我尝试了许多不同的方法来实现此方法,但返回的List是错误的。我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:3)

您只是创建FileObject的一个实例,只是一遍又一遍地将其添加到列表中。尽管使用setter方法(如setName()setPath())来修改其属性,但 not 将为您提供您期望的结果。

Java在将对象添加到集合/数据结构时不会复制该对象。因此,通过调用set...()循环中的for方法,您将改变已添加到列表中的现有实例。

尝试将FileObject的实例化移动到循环中:

private static List<FileObject> getAllFilePaths(String rootDir, List<FileObject> helper) {
    File directory = new File(rootDir);
    System.out.println("rootDir: "+rootDir);
    //get all files and directories
    File[] allFiles = directory.listFiles();
    for (File file : allFiles) {
        if (file.isFile()) {
            System.out.println("If file: "+file.getName());
            //if it's a file add it to results

            FileObject fo=new FileObject(); // < Instantiate the FileObject here

            fo.setPath(file.getAbsolutePath());
            fo.setName(file.getName());
            helper.add(fo);
        } else if (file.isDirectory()) {
            System.out.println("else if: "+file.getName());
            //is it's a directory do the method again and add to to results
            //fo.setPath(file.getAbsolutePath());
            //fo.setName(file.getName());
            //results.add(fo);
            getAllFilePaths(file.getAbsolutePath(),helper);
        }
    }
    return helper;
}