递归读取指定目录下的文件
序言
需要读取sftp服务器上符合指定的文件名正则的文件列表,目前想到的最好的办法就是递归。
我这里引入的依赖是:
<!-- jsch-sftp连接 --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.54</version></dependency>
不废话直接上代码:
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个文件:
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());}}
-----------------知道的越多, 不知道的越多--------------------
相关文章:
递归读取指定目录下的文件
序言 需要读取sftp服务器上符合指定的文件名正则的文件列表,目前想到的最好的办法就是递归。 我这里引入的依赖是: <!-- jsch-sftp连接 --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artif…...

【模型压缩】原理及实例
在移动智能终端品类越发多样的时代,为了让模型可以顺利部署在算力和存储空间都受限的移动终端,对模型进行压缩尤为重要。模型压缩(model compression)可以降低神经网络参数量,减少延迟时间,从而实现提高神经…...

常用的JVM启动参数有哪些?
大家好,我是锋哥。今天分享关于【常用的JVM启动参数有哪些?】面试题。希望对大家有帮助; 常用的JVM启动参数有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM(Java Virtual Machine)启…...
Curvelet 变换与FDCT
Curvelet变换 Curvelet变换 是一种多尺度、多方向的信号分析工具,专门用于处理具有各向异性特征的信号,例如边缘和曲线。与传统的傅里叶变换和小波变换相比,Curvelet变换能够更精确地表示信号中的曲线特征,因此在图像处理、地震数据分析、医学成像等领域得到了广泛应用。 …...

Django Admin 管理工具
Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它: /HelloWorld/HelloWorld/settings.py 文件代码: INSTALLED_APPS ( django.contrib.admin, django.co…...

Android笔记【19】
具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…...

矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例(中英双语)
本文中的例子来源于: 这本书,网址为:https://web.stanford.edu/~boyd/vmls/ 矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例 在量化金融中,矩阵作为一种重要的数学工具,被广泛用于描述和分析…...

Docker 中如何限制CPU和内存的使用 ?
在容器化的动态世界中,Docker 已经成为构建、部署和管理容器化的关键工具应用。然而,Docker 的效率在很大程度上取决于资源管理得有多好。设置适当的内存和 CPU 限制对于优化 Docker 性能至关重要,确保每个容器在不使主机负担过重的情况下获得…...

【AIGC-ChatGPT进阶提示词-《动图生成》】怪物工厂:融合想象力与创造力的奇幻世界
引言 在这个科技飞速发展的时代,人工智能正在不断突破我们的想象。而在众多AI应用中,有一个独特的创意工具正在悄然兴起,它就是"怪物工厂"。这个神奇的工具能够将人类天马行空的想象力与AI的创造力完美结合,打造出一个个奇异、有趣、甚至有些恐怖的怪物形象。本…...
docker 使用 xz save 镜像
适用场景 如果docker save -o xxx > xxx 镜像体积过大,可以使用 xz 命令压缩。 命令 例如 save busybox:1.31.1 镜像,其中 -T 是使用多核心压缩,可以加快压缩。 docker save busybox:1.31.1 |xz -T 8 > /tmp/busybox:1.31.1安装 xz Ubuntu/Debian sudo apt upda…...
C#经典算法面试题
网络上收集的一些C#经典算法面试题,分享给大家 # 递归算法 ## C#递归算法计算阶乘的方法 > 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿…...

vulnhub靶场【DriftingBlues】之9 final
前言 靶机:DriftingBlues-6,IP地址192.168.1.66 攻击:kali,IP地址192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 网站探测 访…...
有124个叶子节点的,完全二叉树最多有多少个节点
n=n0n1n2 其中n0为叶子节点, n2=n0-1 完全二叉树的定义和性质 最后化简,n=2*n0n1-1...

从RNN到Transformer:生成式AI自回归模型的全面剖析
个人主页:chian-ocean 文章专栏 生成式AI中的自回归模型详解 在生成式AI的飞速发展中,自回归模型作为核心技术之一,成为文本生成、语音合成、图像生成等领域的重要支柱。本文将全面探讨自回归模型的原理、架构、实际应用,并结合…...

Java爬虫大冒险:如何征服1688商品搜索之巅
在这个信息爆炸的时代,数据就是力量。对于电商平台而言,数据更是金矿。今天,我们要踏上一场Java爬虫的冒险之旅,目标是征服1688这个B2B电商巨头,获取按关键字搜索的商品信息。这不仅是技术的挑战,更是智慧的…...

基于Spring Boot的无可购物网站系统
一、系统背景与意义 随着互联网的快速发展,电子商务已经成为人们日常生活的重要组成部分。构建一个稳定、高效、可扩展的电商平台后端系统,对于满足用户需求、提升用户体验、推动业务发展具有重要意义。Spring Boot作为当前流行的Java开发框架ÿ…...
智能人家谱程序创意
实现一个家谱程序,并结合自传、视频、图片资料和智能对话系统,涉及到多个领域的技术:自然语言处理(NLP)、机器学习、计算机视觉、多媒体处理和数据存储。下面,我为你制定一个可执行的计划,详细阐…...

Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版
大家好,我是袁庭新。 在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中࿰…...

解决QTCreator在Debug时无法显示std::string类型的问题
环境: 操作系统:Ubuntu 20.04.6 LTS QT版本:Qt Creator 4.11.0 问题: Debug时,无法显示std::string类型的值,如下图: 解决方法: 修改/usr/share/qtcreator/debugger/stdtypes.py…...
leetcode 面试经典 150 题:无重复字符的最长子串
链接无重复字符的最长子串题序号3类型字符串解题方法滑动窗口难度中等 题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 …...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...