Java整合Jsch实现SFTP连接对服务器文件增删改查操作

我们在开发中,有时候需要操作服务器上的文件,Spring Boot可以使用JSch库来连接SFTP并进行操作服务器上的文件读写。

创建一个SFTP连接需要以下步骤:

  • 1.创建JSch对象
  • 2.使用JSch对象创建Session对象
  • 3.使用Session对象连接到SFTP服务器
  • 4.打开SFTP通道
  • 5.使用SFTP通道打开SFTP连接
1.添加依赖

pom.xml文件中添加以下依赖:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>
2.创建SftpConfig配置类
import lombok.Getter;
import lombok.Setter;/*** <p>* SFTP连接参数配置类* description: 如果后续只需要操作一台固定不变的服务器,可以从配置文件中读取* </p>** @author * @Url * @since */
@Setter
@Getter
public class SftpConfig {/*** SFTP服务器地址*/private String host;/*** SFTP服务器端口*/private int port;/*** SFTP服务器用户名*/private String username;/*** SFTP服务器密码 如果不使用密码方式则留空*/private String password;/*** 密钥文件路径,如果不使用密钥连接则留空*/private String privateKeyPath;/*** 密钥文件口令,如果不使用密钥连接则留空*/private String passphrase;/*** 连接SFTP服务器超时时间 2秒*/private Integer sessionConnectTimeoutTime = 2000;/*** 打开通道超时时间 2秒*/private Integer channelSftpConnectTimeoutTime = 2000;/*** 密码方式连接方法** @param host           SFTP服务器地址* @param port           SFTP服务器端口* @param username       SFTP服务器用户名* @param password       SFTP服务器密码 如果不使用连接则留空*/public SftpConfig(String host, int port, String username, String password) {this.host = host;this.port = port;this.username = username;this.password = password;}/*** 秘钥方式连接方法** @param host           SFTP服务器地址* @param port           SFTP服务器端口* @param username       SFTP服务器用户名* @param privateKeyPath 密钥文件路径,如果不使用密钥连接则留空* @param passphrase     密钥文件口令,如果不使用密钥连接则留空*/public SftpConfig(String host, int port, String username,String privateKeyPath, String passphrase) {this.host = host;this.port = port;this.username = username;this.privateKeyPath = privateKeyPath;this.passphrase = passphrase;}}
3.创建SFTP操作工具类
import com.jcraft.jsch.*;
import com.risk.riskControl.config.SftpConfig;import java.io.*;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** <p>* SFTP操作工具类* </p>** @author * @Url * @since */
public class SftpService {/*** SFTP连接参数*/private SftpConfig config;/*** JSch对象,用于创建SFTP连接*/private JSch jsch;/*** Session对象,用于连接到SFTP服务器*/private Session session;/*** SFTP通道,用于打开SFTP连接*/private ChannelSftp channelSftp;/*** 构造函数,初始化SFTP连接参数** @param config SFTP连接参数*/public SftpService(SftpConfig config) {this.config = config;// 创建JSch对象this.jsch = new JSch();}/*** 连接到SFTP服务器** @throws JSchException*/public void connect() throws JSchException {try {// 创建Session对象session = jsch.getSession(config.getUsername(), config.getHost(), config.getPort());if (config.getPassword() != null) {// 使用密码连接session.setPassword(config.getPassword());} else if (config.getPrivateKeyPath() != null) {// 使用私钥连接jsch.addIdentity(config.getPrivateKeyPath(), config.getPassphrase());}// 不进行主机密钥检查session.setConfig("StrictHostKeyChecking", "no");// 设置SFTP连接超时时间session.connect(config.getSessionConnectTimeoutTime());// 打开SFTP通道channelSftp = (ChannelSftp) session.openChannel("sftp");// 设置通道连接超时时间channelSftp.connect(config.getChannelSftpConnectTimeoutTime());} catch (JSchException e) {// 连接异常处理throw new JSchException("Failed to connect to SFTP server: " + e.getMessage());}}/*** 断开SFTP连接*/public void disconnect() {if (channelSftp != null) {// 断开SFTP连接channelSftp.disconnect();}if (session != null) {// 断开Session连接session.disconnect();}}/*** 上传文件到SFTP服务器** @param localFilePath  本地文件路径* @param remoteFilePath SFTP服务器文件路径* @throws SftpException* @throws FileNotFoundException*/public void uploadFile(String localFilePath, String remoteFilePath) throws SftpException, IOException {// 使用try-with-resources语句,可以自动关闭资源try (InputStream inputStream = new FileInputStream(localFilePath)) {// 上传文件到SFTP服务器channelSftp.put(inputStream, remoteFilePath);}}/*** 从SFTP服务器下载文件** @param remoteFilePath SFTP服务器文件路径* @param localFilePath  本地文件路径* @throws SftpException* @throws FileNotFoundException*/public void downloadFile(String remoteFilePath, String localFilePath) throws SftpException, IOException {// 使用try-with-resources语句,可以自动关闭资源try (OutputStream outputStream = new FileOutputStream(localFilePath)) {// 从SFTP服务器下载文件channelSftp.get(remoteFilePath, outputStream);}}/*** 删除SFTP服务器上的文件** @param remoteFilePath SFTP服务器文件路径* @throws SftpException*/public void deleteFile(String remoteFilePath) throws SftpException {// 删除SFTP服务器上的文件channelSftp.rm(remoteFilePath);}/*** 列出SFTP服务器上的文件* 使用这段代码会有什么问题,是否还可以优化** @param remoteDirectory SFTP服务器目录* @return 文件列表* @throws SftpException*/public List<String> listFiles(String remoteDirectory) throws SftpException {List<String> fileList;// 列出SFTP服务器上的文件try (Stream<ChannelSftp.LsEntry> stream = channelSftp.ls(remoteDirectory).stream()) {fileList = stream// 过滤掉目录.filter(entry -> !entry.getAttrs().isDir())// 获取文件名.map(ChannelSftp.LsEntry::getFilename)// 将文件名收集到List中.collect(Collectors.toList());}return fileList;}}
4.创建SftpTest测试类
import com.risk.riskControl.config.SftpConfig;import java.util.List;/*** /*** <p>* SftpTest测试类* </p>** @author * @Url * @since */
public class SftpTest {/*** 测试SFTP连接及文件上传、下载、删除、列出操作** @param args* @throws Exception*/public static void main(String[] args) throws Exception {// 构建SFTP参数,如果是参数固定一个不变改为用配置文件读取SftpConfig config = new SftpConfig("sftp.songzixian.com", 22, "szxBlog", "12345678");// 秘钥方式连接//SftpConfig config = new SftpConfig("sftp.songzixian.com", 22, "root", "D:\\id_rsa_szx_blog.ppk","blog123");// 连接到SFTP服务器SftpService sftpService = new SftpService(config);sftpService.connect();// 本地路径String localFilePath = "";// 服务器路径String remoteFilePath = "";// 上传文件使用// 本地文件路径localFilePath = "D:\\code\\a.txt";// SFTP服务器文件路径remoteFilePath = "/usr/local/sftp-test/a.txt";// 上传文件到SFTP服务器sftpService.uploadFile(localFilePath, remoteFilePath);// 下载文件使用// SFTP服务器文件路径remoteFilePath = "/usr/local/sftp-test/a.txt";// 本地文件路径localFilePath = "D:\\code\\aaaa.txt";// 从SFTP服务器下载文件sftpService.downloadFile(remoteFilePath, localFilePath);// 删除文件使用remoteFilePath = "/usr/local/sftp-test/a.txt";// 删除SFTP服务器上的文件sftpService.deleteFile(remoteFilePath);// 列出文件// SFTP服务器目录String remoteDirectory = "/usr/local/sftp-test/";// 列出SFTP服务器上的文件List<String> files = sftpService.listFiles(remoteDirectory);for (String file : files) {System.out.println(file);}System.out.println("操作成功");// 断开SFTP连接sftpService.disconnect();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【神经网络】深入理解多层神经网络(深度神经网络

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&#xff01; 深入理解多层神经网络&#x…

vivado BLACK_BOX、BLI

BLACK_BOX BLACK_BOX属性是一个有用的调试属性&#xff0c;可以将 层次结构关闭并启用合成以为该模块或实体创建一个黑盒。当 属性&#xff0c;即使存在模块或实体的有效逻辑&#xff0c;Vivado合成也会创建 该级别的黑框。此属性可以放置在模块、实体或组件上。 重要提示&…

气流流型烟雾模型研究相关法规要求及拍摄注意事项

气流模式可视化提供制药设施中实际气流模型的视觉记录。它是目前最广泛接受的、证明关键工艺区域的气流模型满足监管期望的方法。此外&#xff0c;气流模型可视化允许多个职能组织发现气流设计和功能的有效性和意义&#xff0c;特别是在关键领域。 与气流模型相关的法规指南要求…

Java——反射

1. 定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到&#xff0c;那么我们就可以…

【Zookeeper】两种基于原生zk客户端的分布式锁的实现

基于zk的分布式锁的实现主要依赖zk节点的原子性&#xff0c;可以基于原生zk来自己实现分布式锁&#xff0c;更多的是基于Curator这个框架来直接使用基于zk的分布式锁[1]。这里我们仅仅讨论基于原生zk客户端依赖自己实现的zk分布式锁。 原生zk客户端中的一些调用如getChildren方…

算法课程笔记——蓝桥云课第25次云课

算法课程笔记——蓝桥云课第25次云课

DDD学习笔记二

模型的要素——用例、视图和构造块 模型的构建步骤 1&#xff09;从用例场景开始&#xff0c;给模型输入概念、属性、术语。 2&#xff09;构建静态领域模型&#xff08;类图&#xff09;&#xff0c;发现领域概念和对象属性。 3&#xff09;构建动态领域模型&#xff08;时序图…

Redis 高速性能揭秘:核心原因解析

1. 数据结构设计 Redis 的高性能很大程度上归功于其内部精心设计的数据结构。Redis 支持五种基本数据类型&#xff1a;字符串&#xff08;String&#xff09;、列表&#xff08;List&#xff09;、集合&#xff08;Set&#xff09;、有序集合&#xff08;Sorted Set&#xff0…

Java中的数据结构选择指南

Java中的数据结构选择指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨在Java中如何选择适合的数据结构以提高代码效率和性能。 1. 简介 在…

MySQL中ALTER DATABASE语句的使用

ALTER DATABASE 是一个数据库管理命令&#xff0c;主要用于修改或更改已存在数据库的各种属性和配置。 ALTER {DATABASE | SCHEMA} [db_name]alter_option ... ALTER {DATABASE | SCHEMA} db_nameUPGRADE DATA DIRECTORY NAMEalter_option: {[DEFAULT] CHARACTER SET [] chars…

rollup-plugin-visualizer 打包体积分析插件(vue+vite)

安装&#xff1a; npm install rollup-plugin-visualizer基本用法&#xff1a; vite.config.js import { visualizer } from rollup-plugin-visualizermodule.exports {plugins: [visualizer({open: true, // 注意这里要设置为true&#xff0c;否则无效 gzipSize: true, /…

在数字化转型中,数字孪生技术的作用和价值几何?

引言&#xff1a;随着全球化和市场竞争的加剧&#xff0c;企业需要通过数字化转型来提高生产效率、优化产品质量、降低成本&#xff0c;以增强自身竞争力。企业需要通过数字化转型更好地理解客户需求&#xff0c;提供个性化、定制化的产品和服务&#xff0c;从而满足客户的多样…

无人门店社区拼团小程序系统源码

​打造便捷购物新体验 &#x1f6d2; 引言&#xff1a;社区购物新趋势 随着科技的飞速发展&#xff0c;无人门店和社区拼团已经成为购物的新趋势。而结合这两者的“无人门店社区拼团微信小程序”更是为我们带来了前所未有的便捷购物体验。无需排队、无需现金交易&#xff0c;只…

平面点云格网过程及可视化介绍(python)

1、背景介绍 实际人工构造物中&#xff0c;很多物体表面为平面结构&#xff0c;因此将点云投影在二维平面上进行处理&#xff0c;如进行点云面积计算、点云边缘提取等。 具体案例可以参考博客&#xff1a;详解基于格网法统计平面点云面积_点云格网法计算xy投影面积-CSDN博客、点…

FTP服务器的错误码和异常处理介绍

在FTP服务器中&#xff0c;常见的错误码包括但不限于&#xff1a; 1、421 服务不可用&#xff1a; 原因&#xff1a;服务器无法接受新的连接&#xff0c;可能是因为达到了连接数限制或者服务器正在执行重启操作。 处理&#xff1a;等待一段时间后重试连接&#xff0c;或联系服务…

chatGPT是什么?到底用了什么技术呢?未来apple intelligence会用chatgpt的大模型?

本文尽可能精简的讲解openai的chatgpt 文章目录 前言一、chatgpt是什么&#xff1f;1. 基础架构2. 训练过程3. 应用场景4. 技术特点5. 局限性 二、树形图ChatGPT 大致架构 总结 前言 随着人工智能的不断发展&#xff0c;Ai对话工具的使用也越来越广泛。由国外openai推出的chatg…

【高考志愿】计算机

目录 一、专业概述 二、就业方向 三、选择建议 四、注意事项 高考志愿选择计算机专业&#xff0c;无疑是一个充满挑战与机遇的决策。这个专业以其广泛的应用领域、前沿的技术研究和可观的就业前景&#xff0c;吸引了无数考生的目光。 一、专业概述 计算机专业是一门以计算…

Keka for Mac:轻量级压缩解压神器

Keka for Mac是一款专为Mac用户打造的轻量级压缩解压软件&#xff0c;凭借其强大的功能和简洁易用的界面&#xff0c;赢得了众多用户的喜爱。无论是日常办公还是学习娱乐&#xff0c;Keka都能为您提供高效、安全的文件压缩和解压体验。 Keka for Mac v1.4.2中文版下载 产品特点…

Promise入门详解

文章目录 Promise 的介绍和优点&#xff08;为什么需要 Promise&#xff1f;&#xff09;Promise 的基本使用Promise 的状态和回调函数Promise 对象的 3 种状态 Promise 的回调函数Promise的状态图&#xff1a; new Promise() 是同步代码Promise 封装定时器Promise 封装 Ajax 请…

同步时钟系统为何能成为机场时间管理的好伙伴?

在机场这个分秒必争的环境中&#xff0c;精准的时间管理至关重要。同步时钟系统的出现&#xff0c;成为了机场时间管理的得力助手&#xff0c;为机场的高效运行和服务质量的提升发挥了关键作用。 一、同步时钟系统简介 同步时钟系统是一种通过网络技术实现时间同步的高精度计时…