Java使用sftp定時下載文件的示例代碼
sftp簡介
sftp是Secure File Transfer Protocol的縮寫,安全文件傳送協(xié)議。可以為傳輸文件提供一種安全的網(wǎng)絡(luò)的加密方法。sftp 與 ftp 有著幾乎一樣的語法和功能。SFTP 為 SSH的其中一部分,是一種傳輸檔案至 Blogger 伺服器的安全方式。其實在SSH軟件包中,已經(jīng)包含了一個叫作SFTP(Secure File Transfer Protocol)的安全文件信息傳輸子系統(tǒng),SFTP本身沒有單獨的守護進(jìn)程,它必須使用sshd守護進(jìn)程(端口號默認(rèn)是22)來完成相應(yīng)的連接和答復(fù)操作,所以從某種意義上來說,SFTP并不像一個服務(wù)器程序,而更像是一個客戶端程序。SFTP同樣是使用加密傳輸認(rèn)證信息和傳輸?shù)臄?shù)據(jù),所以,使用SFTP是非常安全的。但是,由于這種傳輸方式使用了加密/解密技術(shù),所以傳輸效率比普通的FTP要低得多,如果您對網(wǎng)絡(luò)安全性要求更高時,可以使用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(); } } /** * 關(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 上次處理文件的最后的時間 * @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點開始執(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(); // 上次處理文件的最后時間 lastTime = sftpDTO.getLastTime(); maxTime = Math.max(maxTime, handle(root, lastTime)); // 更新最后處理時間 if (!maxTime.equals(lastTime)) { sftpDTO.setLastTime(maxTime); sftpService.update(sftpDTO); } } // 釋放sftp資源 close(); } }
總結(jié)
以上所述是小編給大家介紹的Java使用sftp定時下載文件的示例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java servlet通過事件驅(qū)動進(jìn)行高性能長輪詢詳解
這篇文章主要介紹了基于servlet3.0+事件驅(qū)動實現(xiàn)高性能長輪詢的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2022-06-06Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)
這篇文章主要為大家介紹了一個Java工具類,可以實現(xiàn)Java公用實體類轉(zhuǎn)Tree結(jié)構(gòu),文中的示例代碼簡潔易懂,感興趣的小伙伴可以參考一下2024-10-10springMVC配置環(huán)境實現(xiàn)文件上傳和下載
這篇文章主要為大家詳細(xì)介紹了springMVC配置環(huán)境實現(xiàn)文件上傳和下載的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05IDEA利用jclasslib 修改class文件的實現(xiàn)
這篇文章主要介紹了IDEA利用jclasslib 修改class文件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Lombok的詳細(xì)使用及優(yōu)缺點總結(jié)
最近在學(xué)Mybatis,接觸到了Lombok的使用,所以寫一篇文章記錄一下,包括lombok的安裝及使用優(yōu)缺點,感興趣的朋友跟隨小編一起看看吧2021-07-07關(guān)于Long和Integer相互轉(zhuǎn)換方式
這篇文章主要介紹了關(guān)于Long和Integer相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08SpringBoot使用注解進(jìn)行分頁的實現(xiàn)示例
分頁使用可以說非常普遍了,有時候會需要非常靈活的方式去開啟或關(guān)閉分頁,嘗試使用一下注解的方式來進(jìn)行分頁,本文主要介紹了SpringBoot使用注解進(jìn)行分頁的實現(xiàn)示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03