Java使用sftp定时下载文件的示例代码
作者:tianshl 发布时间:2022-11-14 06:11:47
标签:java,sftp,下载,文件
sftp简介
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
添加依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
增加配置
sftp:
ip: 192.168.1.60
port: 22
timeout: 60000
retryTime: 3
admin:
username: admin
password: 2k3xrYjbd930.
代码示例
每天凌晨1点在多个用户目录中下载csv文件至本地tmp目录
@Service
public class SftpTask extends Thread {
private ChannelSftp sftp;
private Session session;
@Value("${sftp.admin.username}")
private String username;
@Value("${sftp.admin.password}")
private String password;
@Value("${sftp.host}")
private String host;
@Value("${sftp.port}")
private Integer port;
private SftpService sftpService;
public EtlSftpTask (SftpService sftpService) {
this.sftpService = sftpService;
}
/**
* 建立sftp连接
*/
private void connect(){
try {
JSch jSch = new JSch();
session = jSch.getSession(username, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
}catch (JSchException e) {
e.printStackTrace();
}
}
/**
* 关闭sftp连接
*/
public void close(){
try {
if (sftp != null) {
if (sftp.isConnected()) sftp.disconnect();
}
if(session != null){
if (session.isConnected()) session.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 下载文件到本地
*
* @param source 源文件
* @param target 目标文件
* @throws SftpException 异常
* @throws FileNotFoundException 异常
*/
private void download(String source, String target) throws SftpException, FileNotFoundException {
sftp.get(source, new FileOutputStream(new File(target)));
}
/**
* 处理用户数据文件
*
* @param root 数据文件根目录
* @param lastTime 上次处理文件的最后的时间
* @return 本次处理文件的最后的时间
*/
private Integer handle(String root, Integer lastTime) {
String directory = root + "/event/";
Vector files;
try {
files = sftp.ls(directory + "event_*.csv");
} catch (Exception e) {
e.printStackTrace();
return 0;
}
// 文件名
String fileName;
// 临时文件
String tmpFile;
// 文件更新时间
Integer mTime;
// 文件最后更新时间
Integer maxTime = lastTime;
// 处理用户文件
for(Object o: files) {
try {
ChannelSftp.LsEntry f = (ChannelSftp.LsEntry) o;
// 文件更新时间
mTime = f.getAttrs().getMTime();
if (mTime <= lastTime) continue;
// 文件名
fileName = f.getFilename();
// 最后处理事件
maxTime = Math.max(maxTime, mTime);
// 下载文件
tmpFile = "/tmp/" + fileName;
download(directory + fileName, tmpFile);
} catch (Exception e) {
// TODO 错误日志
e.printStackTrace();
}
}
// 返回文件最后的处理时间
return maxTime;
}
/**
* 每天凌晨1点开始执行
*/
@Scheduled(cron = "0 0 1 * * *")
public void task () {
// 获取sftp连接
connect();
String root;
Integer lastTime;
Long cid;
Integer maxTime = lastTime;
// 获取用户列表
for (SftpDTO sftpDTO: sftpService.findAll()) {
// 用户主目录
root = sftpDTO.getSftpRoot();
// 上次处理文件的最后时间
lastTime = sftpDTO.getLastTime();
maxTime = Math.max(maxTime, handle(root, lastTime));
// 更新最后处理时间
if (!maxTime.equals(lastTime)) {
sftpDTO.setLastTime(maxTime);
sftpService.update(sftpDTO);
}
}
// 释放sftp资源
close();
}
}
总结
以上所述是小编给大家介绍的Java使用sftp定时下载文件的示例代码网站的支持!
来源:https://my.oschina.net/tianshl/blog/1811017
0
投稿
猜你喜欢
- 一. switch分支结构1. 简介switch结合case,能够判断一个变量或表达式与一系列值中的某个值是否相等,这里的每个值都被称为一个
- 本文实例讲述了Java二维数组简单定义与使用方法。分享给大家供大家参考,具体如下:Java的二维数组是先创建一个一维数组,然后该数组的元素再
- 本文实例讲述了Java中计算时间差的方法。分享给大家供大家参考。具体如下:假设现在是2004-03-26 13:31:40过去是:2004-
- 本文实例为大家分享了java实现银行ATM管理系统的具体代码,供大家参考,具体内容如下功能账户类、首页设计分析① 每个用户一个账户对象,需要
- 代码如下所示:package com.hoo.util; import java.awt.Color; import
- Spring JPA 增加字段执行异常用Spring jpa Entity里面增加了几个字段,但启动报错,提示column Unable t
- 注意:这篇博客已经和当前的分页插件完全不一样了,所以建议大家通过上面项目地址查看最新的源码和文档来了解。以前为Mybatis分页查询发愁过,
- 本文介绍了Java实现动态获取图片验证码的示例代码,分享给大家,具体如下:import javax.imageio.ImageIO;impo
- 一、创建项目创建一个简单的Java项目,其中Main.java为主函数,包含main方法:二、完成JAR配置进入File->Proje
- 使用 transient 修饰private transient String noColumn;使用 static 修饰private s
- 在基于Mybatis-plus实现多租户架构中,介绍了在多租户项目中如果要开启一个子线程,那么需要手动进行RequestAttributes
- 概念理解Properties 继承于 Hashtable。表示一个持久的属性集,属性列表以key-value的形式存在,key和value都
- 本文实例讲述了C#实现多线程下载文件的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co
- 1.注解方式,yml文件配置上以下就可以直接使用mybatis-plus: mapper-locations: classpath:mapp
- Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试;生成测试数据初始化数据库用于测试;Spr
- 本文实例讲述了C#多线程学习之生产者和消费者用法。分享给大家供大家参考。具体实分析如下:前面的文章说过,每个线程都有自己的资源,但是代码区是
- 因为公司现在换成了nacos,所以自己写了demo学习一下。结果第一步就走不下去。在使用nacos-config读取nacos配置时。发现b
- mkdir函数用于创建目录。格式如下:#include<sys/types.h>#include<sys/stat.h&g
- 本文实例讲述了C#使用oledb操作excel文件的方法。分享给大家供大家参考。具体分析如下:不管什么编程语言都会提供操作Excel文件的方
- 什么是fescar?关于fescar的详细介绍,请参阅fescar wiki。传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交