java实现从ftp服务器拷贝文件到另一台服务器
2021/11/19 1:10:40
本文主要是介绍java实现从ftp服务器拷贝文件到另一台服务器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- 前言
- 1、连接ftp
- 2、连接sftp
- 3、获取ftp文件流
- 4、在sftp连接服务器上创建目录
- 5、上传到sftp所在服务器
前言
通过ftp连接ftp服务器,通过sftp连接另外一台服务器,实现文件拷贝。
1、连接ftp
/** * 连接FTP */ public void connect(String host, int port, String user, String pwd) { FTPClient client = new FTPClient(); try { // 连接 client.connect(host, port); // 登陆 if (user == null || "".equals(user)) { client.login("anonymous", "anonymous"); } else { client.login(user, pwd); } // 二进制文件支持 client.setFileType(FTPClient.BINARY_FILE_TYPE); // 获取FTP应答 int reply = client.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { client.disconnect(); return; } FTPClientConfig config = new FTPClientConfig(client.getSystemType().split(" ")[0]); client.configure(config); client.setBufferSize(1024); client.enterLocalPassiveMode(); client.setControlEncoding("utf-8"); this.client = client; } catch (IOException e) { e.printStackTrace(); } }
2、连接sftp
/** * 连接sftp服务器 * * @param host 主机 * @param port 端口 * @param username 用户名 * @param password 密码 */ public void sessionConnect(String host, int port, String username, String password) { try { this.jsch = new JSch(); this.sshSession = jsch.getSession(username, host, port); this.sshSession.setPassword(password); Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no"); this.sshSession.setConfig(sshConfig); this.sshSession.connect(); } catch (Exception e) { log.error("SftpUtil Session host=[" + host + "];port=[" + port + "];user=[" + username + "];passwd=[" + password + "] error : ", e); } } /** * 连接sftp */ public SftpUtils sftpConnect() { if (sftp == null) { try { Channel channelSftp = this.sshSession.openChannel("sftp"); this.sftp = (ChannelSftp) channelSftp; sftp.connect(); } catch (Exception e) { log.error("SftpUtil ChannelSftp error : ", e.getMessage()); } } return this; }
3、获取ftp文件流
/** * 获取远程文件的输出流 * * @param client ftp连接,这里传进来是因为不能在该方法的最后释放连接 * @param fileName 文件名称,FTP上的文件名称 * @param remotePath ftp上的远程目录文件 */ public static InputStream retrieveFileStream(FTPClient client, String fileName, String remotePath) throws Exception { boolean success = false; try { success = switchDirectory(client, remotePath, false); if (success) { return client.retrieveFileStream(fileName); } } catch (Exception e) { log.debug("获取ftp文件流异常,error: {}", e.getMessage()); throw new RuntimeException("获取ftp文件流异常 error" + e.getMessage()); } return null; }
4、在sftp连接服务器上创建目录
String mkdir = "mkdir -p " + remotePath; String exit = "exit"; sftp.shellConnect().executeShell(mkdir, exit);
/** * 创建shell连接 */ public SftpUtil shellConnect() { if (shell == null) { try { Channel chnanelShell = this.sshSession.openChannel("shell"); shell = (ChannelShell) chnanelShell; shell.connect(); } catch (Exception e) { log.error("SftpUtil ChannelShell error : ", e.getMessage()); } } return this; }
/** * 执行shell 命令 */ public boolean executeShell(String... cmds) { ChannelShell shell = null; try { Channel chnanelShell = this.sshSession.openChannel("shell"); shell = (ChannelShell) chnanelShell; shell.connect(); } catch (JSchException e) { log.error("SftpUtil ChannelShell error : ", e); } try { InputStream in = shell.getInputStream(); OutputStream out = shell.getOutputStream(); PrintWriter writer = new PrintWriter(out); for (String cmd : cmds) { writer.println(cmd); } writer.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String msg = ""; StringBuilder result = new StringBuilder(); while ((msg = reader.readLine()) != null) { // result.append(msg).append(System.lineSeparator()); } } catch (IOException e) { throw new RuntimeException("执行命令出错,cmd : " + ArrayUtils.toString(cmds) + " , error : " + e.getMessage()); } finally { shell.disconnect(); } return true; }
5、上传到sftp所在服务器
/** * 上传文件 * * @param src 要上传的文件流 * @param dir 上传的目录 * @param fileName 文件名称 */ public boolean uploadStream(InputStream src, String dir, String fileName) throws Exception { boolean success = false; try { this.sftp.cd(dir); this.sftp.put(src, fileName); success = true; } catch (Exception e) { log.error("SftpUtil upload directory=[" + dir + "];uploadFile=[" + fileName + "] error : ", e.getMessage()); throw new RuntimeException("上传文件异常," + "upload directory=[" + dir + "];uploadFile=[" + fileName + "] error:" + e.getMessage()); } finally { try { if (src != null) { src.close(); } } catch (IOException e) { log.error("SftpUtil upload directory=[" + dir + "];uploadFile=[" + fileName + "] close FileInputStream error : ", e); } } return success; }
这篇关于java实现从ftp服务器拷贝文件到另一台服务器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南