2014-12-13 70 views
2

我有一个名为FileUtils的类中实现的代码,它听起来像。 它所做的只是通过一个文件并将该文件夹下的每个文件夹放在ArrayList中,所以它就像在任何将返回内容的文件上调用.listFiles()方法一样。如何在调用自己的方法中使用ArrayList

private static ArrayList<File> classFileList = new ArrayList<File>(); 

public static ArrayList<File> listFiles(File dir) { 
    if (!dir.isDirectory() || !dir.exists()) 
     return null; 
    for (File file : dir.listFiles()) { 
     classFileList.add(file); 
     listFiles(file); 
    } 
    return classFileList; 
} 

上面的代码工作正常,但它需要类变量ArrayList工作。

如果我在方法内部创建了ArrayList,那么每次调用它时它都会被重置,并且只返回最后一个文件。但是随着我现在的设置,如果我多次调用该方法,那么列表中包含每个文件的重复项。

要么使用方法变量,要么在调用它之后重置类变量。

回答

2

添加参数列表你的方法和其他方法调用它,并且在该方法初始化新的列表,并将其传递到现有的方法。揭露新的方法,而不是现有的一个: -

public static ArrayList<File> listFilesWrapper(File dir){ 
    listFiles (dir , new ArrayList<File>()); 

    } 

public static ArrayList<File> listFiles(File dir,ArrayList<File> classFileList) { 


if (!dir.isDirectory() || !dir.exists()) 
    return null; 
for (File file : dir.listFiles()) { 
    classFileList.add(file); 
    listFiles(file , classFileList); 
} 
return classFileList; 
} 
+0

是的,这是我发布后立即想到的,我只是做了它,它工作得很好,所以我认为这是一个很好的答案,但是当您在for循环中调用时,需要传递classFileList并将其作为参数。只要你做了编辑,我会接受这个答案 – Totalllyrandomguy 2014-12-13 19:38:19

+0

@Tallalllyrandomguy完成,谢谢指出。其实我在这台电脑上没有java,所以在代码中写了代码。复制粘贴你的问题的那一部分。 :-) – Panther 2014-12-13 19:43:21

+0

您还需要传递文件 - listFiles()有2个参数!另外,如果您将classFileList作为参数传递,则该方法可能应该具有void返回类型。 – 2014-12-13 19:47:20

3

您可以递归调用时在函数内部创建一个局部变量和addAll它:

public static List<File> listFiles(File dir) { 
    List<File> result = new ArrayList<>(); 
    if (!dir.isDirectory() || !dir.exists()) 
     return result; // Alternatively: return Collections.emptyList(); 

    for (File file : dir.listFiles()) { 
     result.add(file); 
     result.addAll(listFiles(file)); 
    } 
    return result; 
} 
+0

不会这样做是非常处理器密集型的,因为您需要运行该方法来查找所有文件,然后再为每个文件调用它? – Totalllyrandomguy 2014-12-13 19:34:45

+0

...与OP相同的方式 - 这不再是处理器密集型。 – Mureinik 2014-12-13 19:36:29

+0

@Panther根本不是真的。仔细看看 - for循环的最后一行累加结果 – Mureinik 2014-12-14 06:18:21

1
public static void listFiles(File dir, List<File> files) { 
    if (!dir.isDirectory()) 
     return; 
    for (File file : dir.listFiles()) { 
     files.add(file); 
     listFiles(file, files); 
    } 
} 

然后获得目录中的所有文件的列表,使用此代码;

List<File> files = new ArrayList<File>(); 
listFiles(dir, files); // Now the result is contained in files. 
相关问题