首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Java递归列出目录中的所有文件

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

Stack Overflow用户
提问于 2010-03-29 05:26:33
回答 17查看 189.3K关注 0票数 92

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

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

代码语言:javascript
复制
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());
        }
    }
}

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

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-03-29 05:30:05

假设这是您将要编写的实际生产代码,那么我建议使用已经解决这类问题的解决方案- Apache Commons IO,特别是FileUtils.listFiles()。它处理嵌套目录、过滤器(基于名称、修改时间等)。

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

代码语言:javascript
复制
Collection files = FileUtils.listFiles(
  dir, 
  new RegexFileFilter("^(.*?)"), 
  DirectoryFileFilter.DIRECTORY
);

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

值得注意的是,这不会比滚动您自己的代码更快,它做的是相同的事情-在Java中拖拽文件系统只是很慢。不同的是,Apache Commons版本中没有bug。

票数 139
EN

Stack Overflow用户

发布于 2015-11-02 10:29:53

在Java8中,它是一个通过Files.find()的1行代码,具有任意大的深度(例如999)和BasicFileAttributes of isRegularFile()

代码语言:javascript
复制
public static printFnames(String sDir) {
    Files.find(Paths.get(sDir), 999, (p, bfa) -> bfa.isRegularFile()).forEach(System.out::println);
}

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

代码语言:javascript
复制
(p, bfa) -> bfa.isRegularFile()
  && p.getFileName().toString().matches(".*\\.jpg")
  && bfa.lastModifiedTime().toMillis() > System.currentMillis() - 86400000
票数 75
EN

Stack Overflow用户

发布于 2014-06-20 17:44:11

这是一个非常简单的递归方法,可以从给定的根目录获取所有文件。

它使用Java7NIO Path类。

代码语言:javascript
复制
private List<String> getFileNames(List<String> fileNames, Path dir) {
    try(DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
        for (Path path : stream) {
            if(path.toFile().isDirectory()) {
                getFileNames(fileNames, path);
            } else {
                fileNames.add(path.toAbsolutePath().toString());
                System.out.println(path.getFileName());
            }
        }
    } catch(IOException e) {
        e.printStackTrace();
    }
    return fileNames;
} 
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2534632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档