public List<File> addFiles(List<File> files, File dir)
{
if (files == null)
files = new LinkedList<File>();
if (!dir.isDirectory())
{
files.add(dir);
return files;
}
for (File file : dir.listFiles())
addFiles(files, file);
return files;
}
7
对于这种简单的traversion,我更喜欢使用队列而不是递归:
List<File> allFiles = new ArrayList<File>();
Queue<File> dirs = new LinkedList<File>();
dirs.add(new File("/start/dir/"));
while (!dirs.isEmpty()) {
for (File f : dirs.poll().listFiles()) {
if (f.isDirectory()) {
dirs.add(f);
} else if (f.isFile()) {
allFiles.add(f);
}
}
}
20 回答
在Java 8中,我们现在可以使用Files实用程序来遍历文件树 . 非常简单 .
我认为这应该做的工作:
这样你就有了文件和目录 . 现在使用递归并对dirs执行相同的操作(
File
类具有isDirectory()
方法) .Java 8提供了一个很好的流来处理树中的所有文件 .
这提供了一种遍历文件的自然方式 . 由于它是一个流,你可以对结果进行所有不错的流操作,如限制,分组,映射,早退等 .
UPDATE :我可能会指出,如果你需要检查文件属性,那么Files.find也需要BiPredicate才能更有效率 .
请注意,尽管JavaDoc认为此方法可能比Files.walk更有效,但它实际上是相同的,但如果您还要在过滤器中检索文件属性,则可以观察到性能差异 . 最后,如果你需要过滤属性使用Files.find,否则使用Files.walk,大多是因为有's overloads and it'更方便 .
TESTS :根据要求,我提供了许多答案的性能比较 . 看看Github project which contains results and a test case .
FileUtils有iterateFiles和listFiles方法 . 试一试 . (来自commons-io)
编辑:您可以check here获取不同方法的基准 . 似乎commons-io方法很慢,所以选择一些更快的方法from here(如果重要的话)
//准备好了
Java 7将有Files.walkFileTree:
现在有一整个Oracle tutorial on this question .
无需外部库 .
返回一个Collection,这样你就可以在调用后用它做任何你想做的事 .
我会用以下的东西:
System.out.println就是指示对文件执行某些操作 . 没有必要区分文件和目录,因为普通文件只有零个孩子 .
只需使用简单的递归自己编写:
对于这种简单的traversion,我更喜欢使用队列而不是递归:
使用Java 7,您可以使用以下类:
除了递归遍历之外,还可以使用基于访问者的方法 .
下面的代码是使用基于访问者的方法进行遍历 . 预计程序的输入是遍历的根目录 .
此代码已准备好运行
您可以使用以下代码以递归方式获取特定文件夹或目录的文件列表 .
具有单个列表的非递归BFS(特定示例是搜索* .eml文件):
我的版本(当然我可以使用Java 8内置的walk ;-)):
示例在目录中递送* .csv文件递归搜索使用java.nio中的Files.find()的子目录:
发布这个例子,因为我无法理解如何在Bryan给出的#1示例中传递filename参数,使用foreach on Stream-result -
希望这可以帮助 .
这是一个使用
recursion
的简单但完美的解决方案:基于堆垛机答案 . 这是一个在JSP中工作的解决方案,没有任何外部库,因此您几乎可以将它放在服务器上的任何位置:
那你就做一些像: