每隔1分钟(做成配置),sftp连接南京公司服务器指定的目录(做成配置),同时sftp连接江苏省调服务器指定的目录(做成配置)。南京公司服务器作为基准,比较江苏省调服务器上缺失的文件夹和文件,找到缺失文件夹和文件后,上传到江苏省调的服务器。用jdk8的idea编程实现,附加注释

时间: 2024-05-08 20:18:26 浏览: 6
好的,我明白了。以下是对你的问题进行回答: 这是一个需要用到SFTP协议的任务。可以使用开源的Java库JSch来实现SFTP连接。具体实现的步骤如下: 1. 引入JSch依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </dependency> ``` 2. 编写代码 实现的大概思路如下: a. 首先创建两个SFTP连接对象,分别连接南京公司服务器和江苏省调服务器。 b. 然后调用南京公司服务器的SFTP对象的listFiles方法,获取目录下的所有文件和文件夹列表。 c. 对比两个目录下的文件和文件夹,找到差异(江苏省调服务器没有的文件和文件夹)。 d. 然后遍历差异清单,将缺失的文件和文件夹上传到江苏省调服务器中。 ```java // 引入JSch库 import com.jcraft.jsch.*; public class SftpTask { public static void main(String[] args) { String njServer = "南京公司服务器地址"; String njUser = "南京公司服务器用户名"; String njPassword = "南京公司服务器密码"; String njDir = "南京公司服务器目录"; String jsServer = "江苏省调服务器地址"; String jsUser = "江苏省调服务器用户名"; String jsPassword = "江苏省调服务器密码"; String jsDir = "江苏省调服务器目录"; // 建立南京公司服务器连接 Session njSession = null; ChannelSftp njChannel = null; try { JSch jsch = new JSch(); njSession = jsch.getSession(njUser, njServer, 22); njSession.setPassword(njPassword); njSession.setConfig("StrictHostKeyChecking", "no"); njSession.connect(); njChannel = (ChannelSftp) njSession.openChannel("sftp"); njChannel.connect(); // 列出南京公司服务器上的所有文件和目录 Vector njFiles = njChannel.ls(njDir); // 建立江苏省调服务器连接 Session jsSession = null; ChannelSftp jsChannel = null; jsSession = jsch.getSession(jsUser, jsServer, 22); jsSession.setPassword(jsPassword); jsSession.setConfig("StrictHostKeyChecking", "no"); jsSession.connect(); jsChannel = (ChannelSftp) jsSession.openChannel("sftp"); jsChannel.connect(); // 遍历南京公司服务器上的文件和目录,寻找差异 for (Object obj : njFiles) { if (obj instanceof ChannelSftp.LsEntry) { ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) obj; String filename = entry.getFilename(); if (!filename.equals(".") && !filename.equals("..")) { if (entry.getAttrs().isDir()) { // 如果是目录,递归检测目录下的文件和目录 List<String> subFiles = listFiles(njChannel, njDir + "/" + filename); for (String subFile : subFiles) { // 如果江苏省调服务器上没有该文件,上传该文件到江苏省调服务器 if (!exists(jsChannel, jsDir + "/" + subFile)) { uploadFile(njChannel, njDir + "/" + subFile, jsChannel, jsDir); } } } else { // 如果是文件,检测江苏省调服务器上是否存在该文件,如果不存在则上传 if (!exists(jsChannel, jsDir + "/" + filename)) { uploadFile(njChannel, njDir + "/" + filename, jsChannel, jsDir); } } } } } } catch (Exception e) { System.err.println(e.getMessage()); } finally { if (njChannel != null) { njChannel.disconnect(); } if (njSession != null) { njSession.disconnect(); } } } /** * 判断SFTP服务器上是否存在指定目录或文件 * * @param sftp SFTP连接对象 * @param remoteFile 远程文件路径 * @return 存在返回true,否则返回false */ public static boolean exists(ChannelSftp sftp, String remoteFile) { boolean flag = false; try { sftp.stat(remoteFile); flag = true; } catch (Exception e) { flag = false; } return flag; } /** * 列出SFTP服务器上指定目录下的所有文件和目录 * * @param sftp SFTP连接对象 * @param dir 远程目录路径 * @return 文件和目录名列表 */ public static List<String> listFiles(ChannelSftp sftp, String dir) throws Exception { List<String> list = new ArrayList<>(); Vector files = sftp.ls(dir); for (Object obj : files) { if (obj instanceof ChannelSftp.LsEntry) { ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) obj; String filename = entry.getFilename(); if (!filename.equals(".") && !filename.equals("..")) { if (entry.getAttrs().isDir()) { // 如果是目录,递归列出目录下的文件和目录 List<String> subFiles = listFiles(sftp, dir + "/" + filename); for (String subFile : subFiles) { list.add(filename + "/" + subFile); } } else { // 如果是文件,直接添加文件名 list.add(filename); } } } } return list; } /** * 从源SFTP服务器上传文件到目标SFTP服务器 * * @param srcSftp 源SFTP连接对象 * @param srcFile 源文件路径 * @param destSftp 目标SFTP连接对象 * @param destDir 目标目录路径 */ public static void uploadFile(ChannelSftp srcSftp, String srcFile, ChannelSftp destSftp, String destDir) throws Exception { InputStream input = null; OutputStream output = null; try { input = srcSftp.get(srcFile); String filename = new File(srcFile).getName(); String destFile = destDir + "/" + filename; output = destSftp.put(destFile); byte[] buf = new byte[1024]; int n; while ((n = input.read(buf)) != -1) { output.write(buf, 0, n); } } finally { if (output != null) { output.close(); } if (input != null) { input.close(); } } } } ``` 以上就是实现SFTP连接,比较文件差异并上传文件的Java代码。注意需要根据实际情况修改配置变量的值。

相关推荐

最新推荐

recommend-type

linux通过跳板机连接远程服务器并进行文件传输的方法

主要介绍了linux通过跳板机连接远程服务器并进行文件传输的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

Java远程连接Linux服务器并执行命令及上传文件功能

主要介绍了Java远程连接Linux服务器并执行命令及上传文件功能,本文是小编整理的代码笔记,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

linux系统配置sftp服务器详解

该文档介绍了如何在linux系统配置sftp服务器的步骤,大家感受一下。
recommend-type

Windows 利用freeSSHD搭建sftp服务器步骤

该资源主要讲解了windows环境下,使用freeSSHD工具搭建sftp服务器的使用步骤,欢迎有需要的小伙伴下载学习!
recommend-type

Python使用sftp实现上传和下载功能(实例代码)

1.功能实现 根据输入参数判断是文件还是目录,进行上传和下载 本地参数local需要与远程参数remote类型一致,文件以文件名结尾,目录以\结尾 上传和下载的本地和远程目录需要存在 异常捕获 2.代码实现 #!/usr/bin/...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。