首页 > 开发 > Java > 正文

Java使用sftp定时下载文件的示例代码

2024-07-14 08:40:51
字体:
来源:转载
供稿:网友

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。

添加依赖

java;"><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目录

@Servicepublic 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定时下载文件的示例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对VeVb武林网网站的支持!


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表