Java使用sftp定时下载文件的示例代码
程序员文章站
2023-12-17 23:00:34
sftp简介
sftp是secure file transfer protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ft...
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定时下载文件的示例代码,希望对大家有所帮助