[Java]实现列出文件夹下文件(包括按规则筛选、分页、新StreamAPI)

2021-03-11 1578点热度 0人点赞 0条评论

前言

介绍如何在Java中使用各种方法,列出文件夹下的文件(可根据一定的条件筛选,可分页)

传统Java实现(利用File.listFiles)

这种方式暂时无法实现分页,需要分页请往下看

注意,利用File.listFiles得到的结果,有可能会是null,所以要注意异常处理
File dir = new File("/Users/Terry/Downloads");
File[] files = dir.listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        //实现筛选,符合筛选条件的,return true
        return false;
    }
});

利用Java8的java.nio.file.Files.list和Stream

这样代码看起来也很简洁,可以在filter里面增加需要筛选的代码

注意使用Stream的时候,需要使用[mark]try-with-resource[/mark]来自动关闭资源,
详见我之前的文章:https://blog.terrynow.com/2021/01/11/java-stream-files-list-find-walk-cause-too-many-opem-files/

public List<File> listFiles(String baseDir) throws IOException {
    try (Stream<Path> stream = Files.list(Paths.get(baseDir))) {
        return stream.map(Path::toFile).filter(File::isDirectory).collect(Collectors.toList());
    }
}

利用Stream还可以轻松实现分页:

public List<File> listFiles(String baseDir, int start, int size) throws IOException {
    try (Stream<Path> paths = Files.list(Paths.get(baseDir))) {
        return paths.filter(p -> p.toFile().getName().endsWith(".jpg"))
                .skip(start).limit(size) // 分页
                .map(Path::toFile).collect(Collectors.toList());
    }
}

利用[mark]java.nio.file.Files.walk[/mark]实现,还可以实现遍历子文件夹,指定需要遍历的深度

public List<File> listFiles(String baseDir, int depth) throws IOException {
    try (Stream<Path> stream = Files.walk(Paths.get(baseDir), depth)) {
        return stream.map(Path::toFile).filter(File::isDirectory).collect(Collectors.toList());
    }
}

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论