Java工具类之SFTP遍历查找指定目录下包含关键字的的所有文件

Java工具类之SFTP遍历查找指定目录下包含关键字的的所有文件目录 一 工具类代码 二 pom 文件 三 核心代码示例 四 补充 秘钥证书登录 一 工具类代码 public class SFTPUtil private transient Logger logger LoggerFactor getLogger this getClass private

大家好,我是讯享网,很高兴认识大家。

目录

一、工具类代码

二、pom文件

三、核心代码示例


讯享网

四、补充:秘钥证书登录 


一、工具类代码

public class SFTPUtil { private transient Logger logger = LoggerFactory.getLogger(this.getClass()); private ChannelSftp sftp; private Session session; / * SFTP 登录用户名 */ private String username; / * SFTP 登录密码 */ private String password; / * SFTP 服务器地址IP地址 */ private String host; / * SFTP 端口 */ private int port; / * 构造基于密码认证的sftp对象 */ public SFTPUtil(String username, String password, String host, int port) { this.username = username; this.password = password; this.host = host; this.port = port; } public SFTPUtil() { } / * 连接sftp服务器 */ public void login() { try { JSch jsch = new JSch(); if (privateKey != null) { jsch.addIdentity(privateKey);// 设置私钥 jsch.addIdentity(privateKey, pripass); } session = jsch.getSession(username, host, port); if (password != null) { session.setPassword(password); } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; } catch (JSchException e) { e.printStackTrace(); logger.info("sftp login exception:{}", e); } } / * 关闭连接 server */ public void logout() { if (sftp != null) { if (sftp.isConnected()) { sftp.disconnect(); } } if (session != null) { if (session.isConnected()) { session.disconnect(); } } } / * 下载文件。 * * @param directory 下载目录 * @param downloadFile 下载的文件 * @param saveFile 存在本地的路径 */ public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException { if (directory != null && !"".equals(directory)) { sftp.cd(directory); } File file = new File(saveFile); sftp.get(downloadFile, new FileOutputStream(file)); } / * 删除文件 * * @param directory 要删除文件所在目录 * @param deleteFile 要删除的文件 */ public void delete(String directory, String deleteFile) throws SftpException { sftp.cd(directory); sftp.rm(deleteFile); } / * 列出目录下的文件 * * @param directory 要列出的目录 */ public Vector<?> listFiles(String directory) throws SftpException { return sftp.ls(directory); } public List<String> getdownloads(String fileName, String contains) throws SftpException { List<String> list = new ArrayList<String>(); logger.info("下载中。。"); Vector vector = listFiles(fileName); for (int i = 0; i < vector.size(); i++) { ChannelSftp.LsEntry entry = (LsEntry) vector.get(i); if (entry.getFilename().contains(contains)) { list.add(entry.getFilename()); } } return list; } }

讯享网

二、pom文件

讯享网<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency>

三、核心代码示例

public String downloadFile(String date) { String comPath = null; try { SFTPUtil sftp = new SFTPUtil(UserName, hPassWord, Host, Integer.parseInt(port)); sftp.login(); logger.info("登录sftp"); TextUtil.createFile(filePath+"/"+date+"/"+iceName+"/"); List<String> list=sftp.getdownloads(SftpPath, date); for (int i = 0; i < list.size(); i++) { String file=list.get(i); comPath = filePath+"/"+date+"/"+iceName+"/"+file; logger.info("下载文件名:" + comPath); sftp.download(SftpPath, file,comPath); } sftp.logout(); return comPath; } catch (SftpException e) { logger.error("下载失败:", e); return null; } catch (IOException e) { logger.error("下载失败:", e); return null; } }

讯享网public class TextUtil { / * 创建目录 * @return * @throws IOException */ public static void createFile(String fileName) throws IOException{ File file = new File(fileName); if(!file.exists()){ file.mkdirs(); } } }

四、补充:秘钥证书登录 

import com.jcraft.jsch.*; import java.util.Vector; public class LoginTest { //SFTP地址 private static final String HOST = "IP地址"; //端口 private static final int PORT = 2222; //用户名 private static final String USERNAME = "adminabc"; //证书路径 private static final String PRIVATE_KEY_PATH = "E://03/abc.rsa"; //SFTP文件目录 private static final String sftpPath = "/aa/bb/cc"; //本地测试目录 private static final String localFilePath = "E://04/"; //下载关键字 private static final String keyWord = ""; public static void loginWithCertificate() { //创建 JSch 实例 JSch jsch = new JSch(); try { jsch.addIdentity(PRIVATE_KEY_PATH); //创建 SSH 会话 Session session = jsch.getSession(USERNAME, HOST, PORT); / * 设置了会话的配置。StrictHostKeyChecking 是一个 SSH 选项,用于控制 SSH 客户端如何处理未知的主机密钥。 * "yes" 表示客户端会检查主机密钥,"no" 表示客户端会忽略主机密钥,"ask" 表示客户端会提示用户是否接受主机密钥。 * 设置为 "no" 表示客户端不会检查主机密钥是否已知,这可能会导致“man in the middle”攻击,因此只应在测试环境中使用。 */ session.setConfig("StrictHostKeyChecking", "no"); //连接 SSH 服务器,会话将尝试与服务器建立连接 session.connect(); //通过调用 openChannel("sftp") 方法,客户端请求一个 SFTP 通道。此方法返回一个 ChannelSftp 对象,该对象可用于执行 SFTP 操作。 Channel channel = session.openChannel("sftp"); //连接 SFTP 通道,通道将尝试与服务器建立连接 channel.connect(); //将 channel 强制转换为 ChannelSftp 类型,并将其赋值给 sftpChannel 变量。 //使用 sftpChannel 对象来执行各种 SFTP 操作,例如上传/下载文件、列出目录等 ChannelSftp sftpChannel = (ChannelSftp) channel; //登录部分在这里就已经完成了,如果要做成工具类,可以从这里到异常抛出,中间这一部分代码提出 //登录以后,下载指定目录的文件 //判断某路径下文件是否存在,如果存在,下载该路径下所有文件 if (!isDirExist(sftpPath,sftpChannel)) { //当前文件目录存在 System.out.println("目标目录不存在!"); return; } //方法通常用于从 SFTP 服务器下载单个文件。如果要下载整个文件夹,通常需要遍历文件夹 Vector vector = sftpChannel.ls(sftpPath); for (int i = 0; i < vector.size(); i++) { ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) vector.get(i); System.out.println("entry.getFilename():" + entry.getFilename()); if (entry.getFilename().contains(keyWord)) { sftpChannel.get(sftpPath+"/"+entry.getFilename(), localFilePath+"/"+entry.getFilename()); } } sftpChannel.disconnect(); session.disconnect(); } catch (JSchException e) { System.out.println("JSchException"); e.printStackTrace(); } catch (SftpException e) { System.out.println("SftpException"); throw new RuntimeException(e); } } / * 判断目录是否存在 */ public static boolean isDirExist(String directory, ChannelSftp sftp) { boolean isDirExistFlag = false; try { //ChannelSftp 是 JSch 中用于 SFTP (SSH 文件传输协议) 的一个类。 //lstat() 是 ChannelSftp 类的一个方法,用于获取文件或目录的详细信息,但不包括其内容。 //它返回一个 SftpATTRS 对象,该对象包含有关文件或目录的信息,如权限、所有者、大小等。 SftpATTRS sftpATTRS = sftp.lstat(directory); isDirExistFlag = true; return sftpATTRS.isDir(); } catch (Exception e) { if ("no such file".equals(e.getMessage().toLowerCase())) { isDirExistFlag = false; } } return isDirExistFlag; } public static void main(String[] args) { loginWithCertificate(); } }

小讯
上一篇 2025-01-27 11:02
下一篇 2025-03-12 08:44

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/26622.html