递归读取指定目录下的文件

序言

需要读取sftp服务器上符合指定的文件名正则的文件列表,目前想到的最好的办法就是递归。

我这里引入的依赖是:

xml 复制代码
        <!--   jsch-sftp连接     -->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>

不废话直接上代码:

java 复制代码
  public static List<String> getFileList(ChannelSftp channelSftp, String path, String fileNamePattern, Integer filePathDepth) {
        List<String> fileList = Lists.newLinkedList();
        try {
            Pattern pattern = Pattern.compile(fileNamePattern);
            Vector<ChannelSftp.LsEntry> files = channelSftp.ls(path);
            //读取的根路径下一级就是文件
            if (1 == filePathDepth) {
                for (ChannelSftp.LsEntry entry : files) {
                    String fileName = entry.getFilename();
                    //找到和规则(文件名正则)匹配的文件
                    if (pattern.matcher(fileName).matches()) {
                       //拼接全路径
                        String fullPath = path + fileName;
                        fileList.add(fullPath);
                    }
                }
            } else {
                //从读取根路径下开始算目录深度时,目录深度大于1就使用递归来读取文件列表
                manyDirFileList(channelSftp, path, fileNamePattern, fileList, bComFilesaveReadruleDO.getDirPattern());
            }
        } catch (Exception e) {
            log.error("获取sftp指定目录下的文件列表失败,{}", e.getMessage());
        }
        return fileList;
    }


/**
     * 递归获取提供的路径下多级目录下符合正则的所有文件
     *
     * @param channelSftp ftp对象
     * @param path        路径
     * @param fileList    文件列表
     **/
    public static void manyDirFileList(ChannelSftp channelSftp, String path, String fileNamePattern,
                                       List<String> fileList, String dirPattern) throws Exception {
        try {
            List<Pattern> dirPatterns = new ArrayList<>();
            if (StringUtils.isNotEmpty(dirPattern)) {
                for (String pat : dirPattern.split(",")) {
                    dirPatterns.add(Pattern.compile(pat.trim()));
                }
            }
            Pattern fileNamePat = Pattern.compile(fileNamePattern);

            if (isDirectory(channelSftp, path)) {
                Vector<?> vector = channelSftp.ls(path);
                for (Object l : vector) {
                    ChannelSftp.LsEntry file = (ChannelSftp.LsEntry) l;
                    String fileName = file.getFilename();
                    boolean isDirMatch = dirPatterns.isEmpty();
                    for (Pattern dirPat : dirPatterns) {
                        if (dirPat.matcher(fileName).matches()) {
                            isDirMatch = true;
                            break;
                        }
                    }
                    if (fileName.equals(".") || fileName.equals("..")) {
                        continue;
                    }
                    if (isDirMatch || fileNamePat.matcher(fileName).matches()) {
                        String fullPath = path + fileName + (file.getAttrs().isDir() ? "/" : "");
                        manyDirFileList(channelSftp, fullPath, fileNamePattern, fileList, dirPattern);
                    }
                }
            } else {
                String fileName = path.substring(path.lastIndexOf("/") + 1);
                if (fileNamePat.matcher(fileName).matches()) {
                    fileList.add(path);
                }
            }
        } catch (SftpException e) {
            log.error("获取FTP指定目录下的文件异常,路径:{},异常信息:{}", path, e.getMessage());
        } catch (Exception e) {
            log.error("递归获取SFTP指定目录下的文件列表失败,路径:{},异常信息:{}", path, e.getMessage());
            throw new Exception("递归获取SFTP指定目录下的文件列表失败,路径:" + path + ",异常信息:" + e.getMessage());
        }
    }

另外还有一个需求就是只读取10个文件:

java 复制代码
 public static List<String> getFileListFor10(ChannelSftp channelSftp,  String path, String fileNamePattern, Integer filePathDepth) {
        List<String> fileList = Lists.newLinkedList();
        try {
            Pattern pattern = Pattern.compile(fileNamePattern);
            Vector<ChannelSftp.LsEntry> files = channelSftp.ls(path);
            //读取的根路径下一级就是文件
            if (1 == filePathDepth) {
                for (ChannelSftp.LsEntry entry : files) {
                    if (fileList.size() > 10) {
                        log.info("已读取10个文件,不再读取目录:{}下的文件", path);
                        break;
                    }
                    String fileName = entry.getFilename();
                    //找到和规则(文件名正则)匹配的文件
                    if (pattern.matcher(fileName).matches()) {
                        //拼接全路径
                        String fullPath = path + fileName;
                        fileList.add(fullPath);
                    }
                }
            } else {
                //从输入的根路径下开始算目录深度时,目录深度大于1就使用递归来读取文件列表
                manyDirFileListFor10(channelSftp, path, fileNamePattern, fileList, bComFilesaveReadruleDO.getDirPattern());
            }
        } catch (Exception e) {
            log.error("获取sftp指定目录下的文件列表失败,{}", e.getMessage());
        }
        return fileList;
    }

/**
     * 递归获取提供的路径下多级目录下符合正则的前10个文件
     *
     * @param channelSftp ftp对象
     * @param path        路径
     * @param fileList    文件列表
     **/
    public static void manyDirFileListFor10(ChannelSftp channelSftp, String path, String fileNamePattern,
                                       List<String> fileList, String dirPattern) {
        try {
            List<Pattern> dirPatterns = new ArrayList<>();
            if (StringUtils.isNotEmpty(dirPattern)) {
                for (String pat : dirPattern.split(",")) {
                    dirPatterns.add(Pattern.compile(pat.trim()));
                }
            }
            Pattern fileNamePat = Pattern.compile(fileNamePattern);

            if (isDirectory(channelSftp, path)) {
                Vector<?> vector = channelSftp.ls(path);
                for (Object o : vector) {
                    // 如果已经找到了10个文件,直接返回,不再递归
                    if (fileList.size() >= 10) {
                        log.info("已读取10个文件,不再读取目录:{}下的文件", path);
                        break;
                    }
                    ChannelSftp.LsEntry file = (ChannelSftp.LsEntry) o;
                    String fileName = file.getFilename();
                    boolean isDirMatch = dirPatterns.isEmpty();
                    for (Pattern dirPat : dirPatterns) {
                        if (dirPat.matcher(fileName).matches()) {
                            isDirMatch = true;
                            break;
                        }
                    }
                    if (fileName.equals(".") || fileName.equals("..")) {
                        continue;
                    }
                    if (isDirMatch || fileNamePat.matcher(fileName).matches()) {
                        String fullPath = path + fileName + (file.getAttrs().isDir() ? "/" : "");
                        manyDirFileListFor10(channelSftp, fullPath, fileNamePattern, fileList, dirPattern);
                    }
                }
            } else {
                String fileName = path.substring(path.lastIndexOf("/") + 1);
                if (fileNamePat.matcher(fileName).matches()) {
                    fileList.add(path);
                }
            }
        } catch (SftpException e) {
            log.error("获取FTP指定目录下的文件异常,路径:{},异常信息:{}", path, e.getMessage());
        } catch (Exception e) {
            log.error("递归获取SFTP指定目录下的文件列表失败,路径:{},异常信息:{}", path, e.getMessage());
        }
    }

-----------------知道的越多, 不知道的越多--------------------

相关推荐
学长毕设9 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw10 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号11 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠11 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David12 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放12 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户37215742613513 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长13 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节