递归Java后无法将文件添加到列表

Posted

技术标签:

【中文标题】递归Java后无法将文件添加到列表【英文标题】:Unable to add Files to List after recursion Java 【发布时间】:2016-10-04 07:57:05 【问题描述】:

我不太确定如何为这个问题命名,但我遇到了一些我不太了解的错误。

我有一种方法可以递归地在根目录的标记为“计算”的子目录中搜索其文件内容。当我打印到控制台时它似乎工作。但是,当我尝试将这些文件添加到文件列表时,它似乎不起作用,大小为 0...

如何将这些文件添加到 List 或 File[] 或任何类型的数据结构中以便我可以处理它们?

这是我的代码:

public static List<File> walkDirectory(String path) 

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

    File root = new File(path);
    File[] list = root.listFiles();

    if (list == null) return null;

    for (File f : list) 

        if (f.isDirectory()) 
            walkDirectory(f.getAbsolutePath());
         

        else if (f.getParentFile().getName().contains("calculation")) 
            fileList.add( f ); // does not work...
            System.out.println("File: " + f.getAbsoluteFile());

        
    

    return fileList;


public static void main(String[] args) 
    System.out.println(FileWalker.walkDirectory("/path/to/root/directory").size()); // size is 0

【问题讨论】:

【参考方案1】:

将这一行 List&lt;File&gt; fileList = new ArrayList&lt;File&gt;(); 移到 walkDirectory 函数之外。这里发生的是每次调用函数时都会创建一个新的 fileList 变量。

要么使 fileList 成为类的私有静态变量,要么在函数本身中传递 List 参数。

【讨论】:

你是说让fileList成为一个类字段? 我想你已经得到了答案 :) 如果没有,请不要犹豫 这似乎有效!虽然我之前尝试过这个,但我没有在方法之外完成 ArrayList 实例化 你又犯了同样的错误。每次调用函数时,您都在为类变量分配一个局部变量【参考方案2】:
   if (f.isDirectory()) 
        walkDirectory(f.getAbsolutePath());
     

对于walkDirectory() 的结果,您不会返回或做任何事情。您可能希望将结果累积到一个列表中,并在循环完成时返回它。

【讨论】:

是的,这就是我想要完成的目标

以上是关于递归Java后无法将文件添加到列表的主要内容,如果未能解决你的问题,请参考以下文章

递归和追加到列表

具有多个列表的递归排列

IO流 创建java文件列表

Python列表递归更改

异步和递归目录扫描,用于 Nodejs 和 Expressjs 中的文件列表

错误:在Java递归列表反向方法中“无法返回void结果”