在java中使用数组上的文件

时间:2014-10-22 17:37:18

标签: java arrays recursion arraylist

如何将目录文件放在ArrayList中。

public void findFiles(String path) {
    ArrayList<File> list = new ArrayList<File>();
    File[] files = new File(path).listFiles();

    for (File objects : files) {
        if (objects.isFile()) {
            list.add(objects);
        }

        //goes to the deeper layer
        if (objects.isDirectory()) {
            findFiles(objects.getAbsolutePath());
        }
    }
}

但是结尾文件的所有信息都会添加到列表(0)中。 下一步将找到重复项,我想通过比较数组来实现。

2 个答案:

答案 0 :(得分:0)

您的方法只更新一个局部变量,一旦执行完成就会丢失。你应该以某种方式返回它,这样你就可以汇总结果,例如:

public List<File> findFiles(String path){
    List<File> list = new ArrayList<File>();
    File[] files = new File(path).listFiles();
    for(File objects : files) {
         if(objects.isFile()) {
             list.add(objects);
         }
         //goes to the deeper layer
         else if(objects.isDirectory()) {
             list.addAll(findFiles(objects.getAbsolutePath()));
         }
     }
     return list;
}

答案 1 :(得分:0)

您没有从递归调用中返回任何内容,因为您正在调用void方法。您也没有在方法之外可访问的任何对象中设置值。

如果你不做这些事情,那么递归步骤的结果将永远不会保存在任何地方,并且递归中没有任何意义。

执行递归的正确方法是向下传递一个对象引用,每个向下步骤将填充该对象引用,然后在所有递归步骤返回后它将满,或者返回一个值,然后将返回的值与当前步骤的价值。

我将举一个第一种可能性的例子:

public void findFiles(String path, List<File> listToFill){
    File[] files = new File(path).listFiles();
    for(File objects : files) {
         if(objects.isFile()) {
             listToFill.add(objects);
         }
         //goes to the deeper layer
         else if(objects.isDirectory()) {
             findFiles(objects.getAbsolutePath(), listToFill);
         }
     }

}

在这种情况下,您必须先从顶层(或主要)调用它,首先初始化列表,然后将其传递下去(假设您的方法已将path定义为顶层目录的路径,和obj作为具有findFiles方法的对象(您没有告诉我们它的名字)。

List<File> listOfFiles = new ArrayList<File>();

obj.findFiles( path, listOfFiles );