【靠谱】java扫描某个路径下的所有文件(支持嵌套、可根据格式过滤筛选)

作者: ʘᴗʘ发布时间:2021-11-07 20:57 浏览量:243 点赞:177 售价:0

功能介绍

最近工作中遇到一个需求,需要扫描某个路径下的所有文件,并且得根据预先设置的文件格式来过滤。于是就用java的递归实现了一个简单的工具类,分享在本文,欢迎大家使用。

代码说明

代码一共两个函数,第一个函数scanFile是入口函数,需要使用的时候就调用这个函数。里面的主要代码就是检查提供的文件路径是否是一个合法的路径,是否是一个目录。

第二个函数scanFileWorker是递归函数,就是通过递归来循环检查某个文件夹下的所有文件,如果是文件,则加入返回结构List,如果是文件夹则进入下一次递归。

代码如下:

package com.coderbbb.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author longge93
 */
public class FolderFileScanUtil {


    public static List<String> scanFile(String path, String[] exts) {

        File file = new File(path);
        if (!file.exists()) {
            throw new RuntimeException("路径不存在");
        }
        if (!file.isDirectory()) {
            throw new RuntimeException("不是文件夹路径");
        }

        List<String> result = scanFileWorker(path);

        result = result.stream().filter(item -> {
            int index = item.lastIndexOf(".");
            String ext = item.substring(index + 1);
            return Arrays.asList(exts).contains(ext);
        }).collect(Collectors.toList());

        return result;
    }

    private static List<String> scanFileWorker(String path) {

        List<String> result = new ArrayList<>();

        File file = new File(path);
        File[] files = file.listFiles();
        if (files == null || files.length == 0) {
            return result;
        }
        for (File f : files) {
            if (f.isFile()) {
                result.add(f.getAbsolutePath());
            } else {
                result.addAll(scanFileWorker(f.getAbsolutePath()));
            }
        }

        return result;
    }

    public static void main(String[] args) {

        String[] exts = {
                "mp4"
        };

        List<String> data = FolderFileScanUtil.scanFile("D:\\文档\\test-data", exts);
        System.out.println(data);

    }

}

说明一下scanFile函数的入参:

  • path是需要扫描的路径。
  • exts是一个String数组,代表文件后缀名,不在这个数组内的文件将被忽略。

性能优化

我们上面的代码中,扫描一直是单线程进行的。当遇到特别繁杂的路径需要扫描的时候,性能应该还可以通过多线程的手段提升。但是考虑到本身磁盘IO的性能瓶颈,最终性能是受制于单线程还是磁盘IO的极限,还需要再测试一下。后续有结果将更新在本文。

版权声明:《【靠谱】java扫描某个路径下的所有文件(支持嵌套、可根据格式过滤筛选)》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/37

其它推荐:

user

ʘᴗʘ

77
文章数
67030
浏览量
53250
获赞数
67.80
总收入