废话不多说 关键代码如下所示.
paquete com.easstrobot.remote; import java.util.list; import java.util.concurrent.executorservice; import java.util.concurrent.executors; importar org.apache.commons.logging.log; importar org.apache.commons.logging.logFactory; import com.easstrobot.util.propertiesutil; /** * full.zhang * * ftp/sftp 抽象方法类 * */public abstract class fileremote {private static final string ftp_mode = "ftp"; cadena final estática privada sftp_mode = "sftp"; cadena estática pública ftproot; Modo de cadena estática pública; Host de cadena estática pública; Nombre de usuario de cadena estática pública; contraseña pública de cadena estática; puerto de cuerda estática pública; client de fileremote estático privado = nulo; // 最大一次性下载 50 个文件 público estática int max = 50; Logger de registro estático final privado = logFactory.getLog (fileremote.class); public static fileremote getInstance () {if (client == null) {ftProot = PropertiesUtil.getString ("transfer.root"); mode = PropertiesUtil.getString ("transfer.mode"); host = PropertiesUtil.getString ("transfer.host"); UserName = PropertiesUtil.getString ("transfer.Username"); contraseña = PropertiesUtil.getString ("transfer.password"); Port = PropertiesUtil.getString ("transfer.port"); if (mode.equals (ftp_mode)) {client = new FileFtPremote (); } else if (mode.equals (sftp_mode)) {client = new FilesftPremote (); }} Return Client; } / ** * 执行定时任务 * / Public void Process () {logger.debug ("---------------------------------------- 进入定时下载远程文件"); // 创建线程池 EjecutorService Exec = Executors.NeWSingLethreadExeCutor (); exec.execute(new Runnable() { @Override public void run() { // 建立连接 initFtpInfo(host, port, username, password); // 远程服务所有源文件路径集合 List<String> listSourcePath = listRemoteFilePath(ftproot); if (listSourcePath.isEmpty()) { LOGGER.debug("____________________释放连接"); Client.CloSeconnection (); }}); exec.shutdown (); } / ** * 初始化连接 * * @param host * @param puerto * @param username * @param contraseña * @throws excepción * @return * / public abstract void initftpinfo (string host, string puerto, string username, string contraseña); / ** * 下载远程服务下文件到本地服务 * * @param ruta * @return * @throws Exception */ public abstract void downloadRemoteFile (string filepath); / ** * 获取远程服务下指定目录下的所有文件路径集合 (包含子目录下文件) * * @param ruta * @return */ public abstract List <String> listremoteFilePath (ruta de cadena); / ** * 释放连接 */ public abstract void Closeconnection (); } [Java] Ver CopyPackage simple com.easstrobot.remote; import java.io.file; import java.io.fileOutputStream; import java.io.ioException; import java.io.outputstream; import java.util.arrayList; import java.util.list; importar org.apache.commons.io.ioutils; importar org.apache.commons.lang.stringutils; importar org.apache.commons.logging.log; importar org.apache.commons.logging.logFactory; importar org.apache.commons.net.ftp.ftpclient; importar org.apache.commons.net.ftp.ftpfile; importar org.apache.commons.net.ftp.ftpreply; import com.easstrobot.command.commander; Public Class FileFtPremote extiende FilereMote {protegido ftpClient ftpClient; Encoding de cadena privada = "UTF-8"; binario booleano privado = true; Logger de registro estático final privado = logFactory.getLog (fileftpremote.class); @Override public void initftpinfo (string host, string puerto, string username, string contraseña) {try {// 构造一个 ftpClient 实例 ftpClient = new ftpClient (); // 设置字符集 ftpclient.setControlEncoding (codificación); // 连接 ftp 服务器 ftpclient.connect (host, stringUtils.isnotblank (puerto)? Integer.valueOf (puerto): 21); // 连接后检测返回码来校验连接是否成功 int respuesta = ftpclient.getReplyCode (); if (ftpreply.ispositiveCompletion (respuesta)) {// 登陆到 ftp 服务器 if (ftpclient.login (username, contraseña)) {setFileType (); } ftpclient.login (nombre de usuario, contraseña); } else {ftpclient.disconnect (); Logger.error ("ftp 服务拒绝连接!"); }} capt (excepción e) {if (ftpClient.isConnected ()) {try {ftpClient.Disconnect (); // 断开连接} Catch (ioException e1) {logger.error ("ftp 服务连接断开失败!"); }} Logger.error ("ftp 服务连接失败!"); }} / ** * 设置文件传输类型 * / private void setFileType () {try {if (binaryTransfer) {ftpclient.setFileType (ftpclient.binary_file_type); } else {ftpclient.setFileType (ftpclient.ascii_file_type); }} catch (ioException e) {E.PrintStackTrace (); }} @Override public void downloadRemoteFile (String filePath) {if (StringUtils.endswith (filePath, "/") || stringUtils.endswith (filepath, file.separator)) {filepath = filepath.substring (0, filepath.length () - 1); } Archivo saveFile = new File (FilePath); if (saveFile.Exists ()) {return; } // 文件所在目录 string ruta = filePath.substring (0, filePath.lastIndexOf ("/")); if (? } else {ruta = ruta + "/"; }} OutputStream output = null; Pruebe {// 创建目标文件路径 if (! SaveFile.getParentFile (). Exists ()) {SaveFile.GetParentFile (). MkDirs (); } SaveFile.CreateNewFile (); // 转移到 ftp 服务器目录 ftpclient.changeworkingDirectory (ruta); salida = nuevo FileOutputStream (SaveFile); ftpClient.rcrieveFile (filepath, salida); } catch (ioException e) {logger.debug ("文件:" + filepath + "______________________ 下载失败!"); E.PrintStackTrace (); } Finalmente {logger.debug ("文件:" + filepath + "______________________ 下载成功!"); IOutils.Closequietty (salida); }} @Override Public List <String> listremoteFilePath (string ruta) {list <String> list = new ArrayList <String> (); Pruebe {if (! StringUtils.endswith (ruta, "/") &&! StringUtils.endswith (Path, file.separator)) {if (Commander.islinux) {path = path + file.separator; } else {ruta = ruta + "/"; }} boolean cambiado = ftpClient.changeWorkingDirectory (ruta); if (cambiair) {ftpclient.setControlEncoding (codificación); Ftpfile [] archivos = ftpClient.listFiles (); for (archivo ftpfile: archivos) {if (list.size ()> = max) {break; } if (file.isDirectory ()) {if (! } else {ruta = ruta + "/"; }} list.addall (this.listremoteFilePath (path + file.getName ())); } else if (cambiair) {if (! } else {ruta = ruta + "/"; }} Archivo saveFile = nuevo archivo (path + file.getName ()); if (! SaveFile.Exists ()) {list.add (path + file.getName ()); }}}}} Catch (Exception e) {E.PrintStackTrace (); } Lista de retorno; } @Override public void Closeconnection () {if (ftpClient! = Null) {try {ftpClient.logout (); } catch (ioException e) {E.PrintStackTrace (); } Finalmente {if (ftpClient.isConnected ()) {try {ftpClient.disconnect (); } catch (ioException e) {E.PrintStackTrace (); }}}}}} [java] Ver CopyPackage simple com.easstrobot.remote; import java.io.file; import java.io.fileOutputStream; import java.util.arrayList; import java.util.list; import java.util.properties; import java.util.vector; importar org.apache.commons.io.ioutils; importar org.apache.commons.lang.stringutils; importar org.apache.commons.logging.log; importar org.apache.commons.logging.logFactory; import com.easstrobot.command.commander; import com.jcraft.jsch.channel; import com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; import com.jcraft.jsch.session; import com.jcraft.jsch.sftpattrs; import com.jcraft.jsch.sftpexception; import com.jcraft.jsch.channelsftp.lsentry; Public Class FilesftPremote extiende FilereMote {Session protegido Session = NULL; canal protegido fthp canal = null; Private Final Static LogGer = logFactory.getLog (filesftpremote.class); @Override public void initftpinfo (host de cadena, puerto de cadena, nombre de usuario de cadena, contraseña de cadena) {try {jsch jsch = new jsch (); // 创建 jsch 对象 session = jsch.getSession (nombre de usuario, host, stringUtils.isnotblank (puerto)? Integer.valueOf (puerto): 22); session.setPassword (contraseña); // 设置密码 Propiedades config = new Properties (); config.put ("stricthostKeyChecking", "no"); session.setConfig (config); // 为 Sesión 对象设置 Propiedades Session.SetTimeOut (60000); // 设置 Tiempo de espera 时间 session.connect (); // 通过 Sesión 建立链接 canal chan = session.openchannel ("sftp"); // 打开 sftp 通道 chan.connect (); // 建立 sftp 通道的连接 canal = (Channelsftp) chan; } catch (excepción e) {logger.error ("sftp 连接失败"); E.PrintStackTrace (); }} @Override public void downloadRemoteFile (String filePath) {if (StringUtils.endswith (filePath, "/") || stringUtils.endswith (filepath, file.separator)) {filepath = filepath.substring (0, filepath.length () - 1); } Archivo saveFile = new File (FilePath); FileOutputStream output = null; intente {if (saveFile.Exists ()) {return; } // 创建目标文件路径 if (! SaveFile.getParentFile (). Exists ()) {SaveFile.GetParentFile (). MkDirs (); } SaveFile.CreateNewFile (); // 文件所在目录 string ruta = filepath.substring (0, filepath.lastindexof ("/")); if (? } else {ruta = ruta + "/"; }} canal.cd (ruta); Channel.get (FilePath, nuevo FileOutputStream (SaveFile)); Logger.debug ("文件 :" + FilePath + "________________________________________ 下载成功!"); } Catch (Exception e) {logger.debug ("文件 :" + filepath + "____________________________________________ 下载失败!"); E.PrintStackTrace (); } finalmente {ioutils.closequiety (salida); }} @SupessWarnings ("sin verificar") @Override Public List <String> listremoteFilePath (string ruta) {list <string> list = new ArrayList <String> (); Vector <lsentry> v = null; Pruebe {if (! StringUtils.endswith (ruta, "/") && stringUtils.endswith (path, file.separator)) {path = path + file.separator; } v = canal.ls (ruta); } catch (sftPexception e) {E.PrintStackTrace (); } for (lsEntry lsEntry: v) {if (list.size ()> = max) {break; } if (! ".". Equals (lsEntry.getFileName ()) &&! "..". Equals (lsEnsentry.getFileName ())) {sftpattrs attrs = lsentry.getAttrs (); if (attrs.isDir ()) {if (! StringUtils.endswith (ruta, "/") &&! StringUtils.endswith (Path, file.separator)) {if (Commander.islinux) {Path = Path + File.separator; } else {ruta = ruta + "/"; }} list.addall (this.listremotefilePath (ruta + lsentry.getFileName ())); } else {if (! StringUtils.endswith (ruta, "/") &&! StringUtils.endswith (Path, file.separator)) {if (Commander.islinux) {Path = Path + File.separator; } else {ruta = ruta + "/"; }} Archivo saveFile = new File (PATH + LSEntry.getFileName ()); if (! SaveFile.Exists ()) {list.Add (Path + lsEntry.getFileName ()); }}}} Lista de retorno; } @Override public void Closeconnection () {try {if (canal! = Null) {channel.quit (); Channel.disconnect (); } if (session! = null) {session.disconnect (); }} catch (Exception e) {E.PrintStackTrace (); }} Sesión pública getSession () {Sesión de retorno; } public void setSession (sesión de sesión) {this.session = session; } public Channelsftp getChannel () {canal de retorno; } public void setChannel (canal Channelsftp) {this.channel = canal; }}以上所述是小编给大家介绍的 SFTP 和 FTP 根据配置远程服务器地址下载文件到当前服务 , 希望对大家有所帮助 , , 小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!