java 递归读取前10个匹配的文件所在的全路径

需求

有个需求:在连接ftp成功后,读取指定目录下匹配正则表达式的前10个文件。很显然这个需要使用递归,因为会有不同层级的文件目录,不能写死来处理。

第一版代码展示

java 复制代码
public static void test(ChannelSftp channelSftp, 			String path, String fileNamePattern,List<String> fileList, String dirPattern) {
   // 如果已经找到了10个文件,直接返回,不再递归
   if (fileList.size() >= 10) {
       log.info("已读取10个文件,不再读取目录:{}下的文件", path);
       return;
   }
   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) {
               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());
   }
}

当fileList有10个元素了之后,走到return之后并没有结束,而是会继续往下走递归,于是有了第二版:

java 复制代码
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());
        }
    }

这里将fileList.size()>=10的判断放在for循环里,这样就可以了。
----------------------------知道的越多,不知道的越多-------------------------

相关推荐
xyliiiiiL39 分钟前
ZGC初步了解
java·jvm·算法
杉之1 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch2 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
天天向上杰3 小时前
面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
java·bigdecimal
请来次降维打击!!!3 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
用键盘当武器的秋刀鱼3 小时前
springBoot统一响应类型3.5.1版本
java·spring boot·后端
嘤国大力士3 小时前
C++11&QT复习 (七)
java·c++·qt
松树戈3 小时前
Java常用异步方式总结
java·开发语言
weisian1513 小时前
Java常用工具算法-3--加密算法2--非对称加密算法(RSA常用,ECC,DSA)
java·开发语言·算法
小李同学_LHY4 小时前
三.微服务架构中的精妙设计:服务注册/服务发现-Eureka
java·spring boot·spring·springcloud