国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Java > 正文

Java使用sftp定時(shí)下載文件的示例代碼

2024-07-14 08:40:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

sftp簡(jiǎn)介

sftp是Secure File Transfer Protocol的縮寫(xiě),安全文件傳送協(xié)議??梢詾閭鬏斘募峁┮环N安全的網(wǎng)絡(luò)的加密方法。sftp 與 ftp 有著幾乎一樣的語(yǔ)法和功能。SFTP 為 SSH的其中一部分,是一種傳輸檔案至 Blogger 伺服器的安全方式。其實(shí)在SSH軟件包中,已經(jīng)包含了一個(gè)叫作SFTP(Secure File Transfer Protocol)的安全文件信息傳輸子系統(tǒng),SFTP本身沒(méi)有單獨(dú)的守護(hù)進(jìn)程,它必須使用sshd守護(hù)進(jìn)程(端口號(hào)默認(rèn)是22)來(lái)完成相應(yīng)的連接和答復(fù)操作,所以從某種意義上來(lái)說(shuō),SFTP并不像一個(gè)服務(wù)器程序,而更像是一個(gè)客戶端程序。SFTP同樣是使用加密傳輸認(rèn)證信息和傳輸?shù)臄?shù)據(jù),所以,使用SFTP是非常安全的。但是,由于這種傳輸方式使用了加密/解密技術(shù),所以傳輸效率比普通的FTP要低得多,如果您對(duì)網(wǎng)絡(luò)安全性要求更高時(shí),可以使用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點(diǎn)在多個(gè)用戶目錄中下載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();    }  }  /**   * 關(guān)閉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          目標(biāo)文件   * @throws SftpException      異常   * @throws FileNotFoundException  異常   */  private void download(String source, String target) throws SftpException, FileNotFoundException {    sftp.get(source, new FileOutputStream(new File(target)));  }  /**   * 處理用戶數(shù)據(jù)文件   *   * @param root   數(shù)據(jù)文件根目錄   * @param lastTime 上次處理文件的最后的時(shí)間   * @return     本次處理文件的最后的時(shí)間   */  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;    // 臨時(shí)文件    String tmpFile;    // 文件更新時(shí)間    Integer mTime;    // 文件最后更新時(shí)間    Integer maxTime = lastTime;    // 處理用戶文件    for(Object o: files) {      try {        ChannelSftp.LsEntry f = (ChannelSftp.LsEntry) o;        // 文件更新時(shí)間        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 錯(cuò)誤日志        e.printStackTrace();      }    }    // 返回文件最后的處理時(shí)間    return maxTime;  }  /**   * 每天凌晨1點(diǎn)開(kāi)始執(zhí)行   */  @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();      // 上次處理文件的最后時(shí)間      lastTime = sftpDTO.getLastTime();      maxTime = Math.max(maxTime, handle(root, lastTime));      // 更新最后處理時(shí)間      if (!maxTime.equals(lastTime)) {        sftpDTO.setLastTime(maxTime);        sftpService.update(sftpDTO);      }    }    // 釋放sftp資源    close();  }}

總結(jié)

以上所述是小編給大家介紹的Java使用sftp定時(shí)下載文件的示例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 博乐市| 沛县| 山西省| 霍林郭勒市| 遵化市| 文水县| 固安县| 化州市| 文成县| 博客| 西乌珠穆沁旗| 泊头市| 南丰县| 永城市| 桦南县| 林芝县| 皋兰县| 旬阳县| 万山特区| 延安市| 西林县| 商城县| 庄河市| 东兰县| 手机| 珲春市| 巫山县| 红桥区| 锡林浩特市| 丰都县| 桃园市| 灵璧县| 上饶县| 汾西县| 双江| 南溪县| 南宫市| 阿城市| 谢通门县| 寿光市| 碌曲县|