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。

添加依赖

?

1

2

3

4

5

  com.jcraft

  jsch

  0.1.54

增加配置

?

1

2

3

4

5

6

7

8

sftp:

  ip: 192.168.1.60

  port: 22

  timeout: 60000

  retryTime: 3

  admin:

    username: admin

    password: 2k3xrYjbd930.

代码示例

每天凌晨1点在多个用户目录中下载csv文件至本地tmp目录

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

@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://www.jb51.net/article/140374.htm

你可能感兴趣的:(java)