软件编程
位置:首页>> 软件编程>> java编程>> Java使用sftp定时下载文件的示例代码

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
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com