前言
介绍如何在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()); } }
文章评论