如何在Java中递归地列出目录下的所有文件?该框架是否提供了任何实用工具?

我看到了很多黑客的实现.但没有一个来自框架或nio

推荐答案

Java8提供了一个很好的流来处理树中的所有文件.

Files.walk(Paths.get(path))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

这提供了一种遍历文件的自然方式.因为它是一个流,所以你可以对结果进行所有好的流操作,比如限制、分组、映射、提前退出等等.

UPDATE:我可能会指出,如果你需要判断文件属性的话,Files.find也需要BiPredicate,这可能更有效.

Files.find(Paths.get(path),
           Integer.MAX_VALUE,
           (filePath, fileAttr) -> fileAttr.isRegularFile())
        .forEach(System.out::println);

请注意,虽然JavaDoc避免了这种方法可能比Files.walk更有效,但实际上是相同的,如果您也在过滤器中检索文件属性,则可以观察到性能上的差异.最后,如果需要对属性进行过滤,请使用Files.find,否则请使用Files.walk,这主要是因为存在重载,而且更方便.

TESTS:根据要求,我提供了许多答案的性能比较.看看Github project which contains results and a test case.

Java相关问答推荐

如何在Java中对自定义协议进行主机名验证?

Proguard配置以保留具有参数的注释的成员

编译期间错误(Java 0000)Android .Net MAUI

ActivityCompat.请求收件箱自动拒绝权限

缩小画布比例后更改滚动窗格的内部大小

对某一Hyroby控制器禁用@cacheable

在Java中,在单个逻辑行中连接列表和单个元素的正确方法是什么?

具有阻塞方法的开源库是否应该为执行提供异步选项?

将响应转换为带值的键

Spring和可编辑";where";@Query

如何在Java记录中设置BigDecimal类型属性的精度?

GetChildren().emoveAll()不会删除 node

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

如何集成语义发布和BitBucket(Java项目)

如何在代码中将行呈现在矩形前面?

将ByteBuffer异步写入InputStream或Channel或类似对象

Quarkus:运行时出现EnumConstantNotPresentException

如何调整JButton的大小以适应图标?

如何对存储为字符串的大数字数组进行排序?

Cucumber java-maven-示例表-未定义一步