用Java递归列出目录中的所有文件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (129)

我有这个函数递归地打印目录中所有文件的名称。问题是我的代码非常慢,因为每次迭代都必须访问远程网络设备。

我的计划是首先递归地加载目录中的所有文件,然后使用正则表达式遍历所有文件,以过滤掉所有不需要的文件。有没有人有更好的建议?

public static printFnames(String sDir){
  File[] faFiles = new File(sDir).listFiles();
  for(File file: faFiles){
    if(file.getName().matches("^(.*?)")){
      System.out.println(file.getAbsolutePath());
    }
    if(file.isDirectory()){
      printFnames(file.getAbsolutePath());
    }
  }
}

这只是稍后的一个测试,我不打算使用这样的代码,而是将每个匹配高级正则表达式的文件的路径和修改日期添加到数组中。

提问于
用户回答回答于

假设这是实际的生产代码,你会写,那么我建议使用解决这样的事情这已经得到解决- 阿帕奇百科全书IO,具体FileUtils.listFiles()。它处理嵌套的目录,过滤器(基于名称,修改时间等)。

例如,对于你的正则表达式:

Collection files = FileUtils.listFiles(
  dir, 
  new RegexFileFilter("^(.*?)"), 
  DirectoryFileFilter.DIRECTORY
);

这将递归搜索与^(.*?)正则表达式匹配的文件,并将结果作为集合返回。

值得注意的是,这不会比滚动你自己的代码快,它也在做同样的事情 - 用Java拖网文件系统的速度很慢。不同之处在于,Apache Commons版本中没有任何错误。

用户回答回答于

在Java 8,它是通过1-linerFiles.find()与一个任意大的深度(例如999)和BasicFileAttributesisRegularFile()

public static printFnames(String sDir) {
    Files.find(Paths.get(sDir), 999, (p, bfa) -> bfa.isRegularFile()).forEach(System.out::println);
}

要添加更多过滤,请增强lambda,例如在过去24小时内修改的所有jpg文件:

(p, bfa) -> bfa.isRegularFile()
  && p.getFileName().toString().matches(".*\\.jpg")
  && bfa.lastModifiedTime().toMillis() > System.currentMillis() - 86400000

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励