2011-07-21 92 views
12

我试图获取目录及其子目录中所有文件的列表。我目前的递归方法如下:以非递归方式获取目录及其子目录中的所有文件

private void printFiles(File dir) { 
    for (File child : dir.listFiles()) { 
    if (child.isDirectory()) { 
     printFiles(child); 
    } else if (child.isFile()) { 
     System.out.println(child.getPath()); 
    } 
    } 
} 

printFiles(new File("somedir/somedir2")); 

不过,我希望有这样的一个非递归的方式(现有的API调用,也许)。如果不是,这是否是这样做的最干净的方式?

+5

可能的重复[在Java中递归列出文件](http://stackoverflow.com/questions/2056221/recursively-list-files-in-java)。标题说递归,但第一个答案是图书馆电话。 – Jacob

+0

@cularis不是重复的,因为我试图以非递归方式进行,而另一个SO问题是要求它以递归方式进行。 –

+0

递归有什么问题?这里没有API,但是你仍然可以用while循环和一些有趣的其他业务来做到这一点,但它会很麻烦。 –

回答

23

您可以随时更换一个迭代的递归解决方案通过使用堆栈(对于DFS)或队列(对于BFS):

private void printFiles(File dir) { 
    Stack<File> stack = new Stack<File>(); 
    stack.push(dir); 
    while(!stack.isEmpty()) { 
    File child = stack.pop(); 
    if (child.isDirectory()) { 
     for(File f : child.listFiles()) stack.push(f); 
    } else if (child.isFile()) { 
     System.out.println(child.getPath()); 
    } 
    } 
} 

printFiles(新文件( “somedir/somedir2”));

+0

使用堆栈的+1 –

+0

有时我不喜欢Eclipse启动需要多长时间。做得好。我很惊讶为什么有些工程师想知道为什么递归可能很糟糕,为什么使用Stack会很麻烦。 –

+0

堆栈方法看起来比递归方法好,谢谢! –

3

FileUtils可能是最好的方法。 (THE链接的问题复印件) 只发布使人们寻找这会看到它,可能会无法读取评论

编辑:方法使用Listfiles

+0

也许我错过了一些东西,但是我正在查看FileUtils文档,并且在构造函数下面有一个注释“实例不应该在标准编程中构造”。 –

+1

是的。实例...你应该使用它们提供的静态方法。 (顺便说一句,他们几乎都是静态的) – RMT

+1

完美,明白了,谢谢! –

1

Java 8以后,您可以使用Files#walk递归列出给定目录中的所有文件和目录。此外,如果只需要常规文件,则可以使用像Files::isRegularFile这样的过滤器来过滤目录。另一方面,如果您只需要列出给定的目录而不是其子目录,则可以使用惰性方法Files#list,该方法仅给出给定目录中的文件和目录。您可以再次应用上述过滤器。

相关问题