ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:
文件上传put(),文件下载get(),进入指定目录cd().
得到指定目录下的文件列表ls().
重命名指定文件或目录rename().
删除指定文件rm(),创建目录mkdir(),删除目录rmdir().
大家引用方法时可以快速参考一下,具体传参需参考源码~

最后还要提一下的就是JSch支持的三种文件传输模式:

  • APPEND 追加模式,如果目标文件已存在,传输的文件将在目标文件后追加。
  • RESUME 恢复模式,如果文件已经传输一部分,这时由于网络或其他任何原因导致文件传输中断,如果下一次传输相同的文件,则会从上一次中断的地方续传。
  • OVERWRITE 完全覆盖模式,这是JSch的默认文件传输模式,即如果目标文件已经存在,传输的文件将完全覆盖目标文件,产生新的文件。

.实现依赖Jsch-0.1.54.jar

可以在mvn repository 依赖到项目来,我使用的依赖如下:

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.54</version>
</dependency>
package com.cslo.gm.server.po;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSONObject;
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;
/*** * Copyright (c) 2017, 中体彩运营管理公司* All rights reserved.* 文件名称: SFTPUtils.java* 作        者: yxl 2017年10月20日* 创建时间: 2017年10月20日* 功能说明:sftp工具类*/
public class SFTPUtils
{private static final Logger log= LoggerFactory.getLogger(SFTPUtils.class);private String host;//服务器连接ipprivate String username;//用户名private String password;//密码private int port = 22;//端口号private ChannelSftp sftp = null;private Session sshSession = null;public SFTPUtils(){}public SFTPUtils(String host, int port, String username, String password){this.host = host;this.username = username;this.password = password;this.port = port;}public SFTPUtils(String host, String username, String password){this.host = host;this.username = username;this.password = password;}/*** 通过SFTP连接服务器*/public void connect(){try{JSch jsch = new JSch();jsch.getSession(username, host, port);sshSession = jsch.getSession(username, host, port);if (log.isInfoEnabled()){log.info("Session created.");}sshSession.setPassword(password);Properties sshConfig = new Properties();sshConfig.put("StrictHostKeyChecking", "no");sshSession.setConfig(sshConfig);sshSession.connect();if (log.isInfoEnabled()){log.info("Session connected.");}Channel channel = sshSession.openChannel("sftp");channel.connect();if (log.isInfoEnabled()){log.info("Opening Channel.");}sftp = (ChannelSftp) channel;if (log.isInfoEnabled()){log.info("Connected to " + host + ".");}}catch (Exception e){e.printStackTrace();}}/*** 关闭连接*/public void disconnect(){if (this.sftp != null){if (this.sftp.isConnected()){this.sftp.disconnect();if (log.isInfoEnabled()){log.info("sftp is closed already");}}}if (this.sshSession != null){if (this.sshSession.isConnected()){this.sshSession.disconnect();if (log.isInfoEnabled()){log.info("sshSession is closed already");}}}}/*** 批量下载文件* @param remotPath:远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)* @param localPath:本地保存目录(以路径符号结束,D:\Duansha\sftp\)* @param fileFormat:下载文件格式(以特定字符开头,为空不做检验)* @param fileEndFormat:下载文件格式(文件格式)* @param del:下载后是否删除sftp文件* @return*/public List<String> batchDownLoadFile(String remotePath, String localPath,String fileFormat, String fileEndFormat, boolean del){List<String> filenames = new ArrayList<String>();try{// connect();Vector v = listFiles(remotePath);// sftp.cd(remotePath);if (v.size() > 0){System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size());Iterator it = v.iterator();while (it.hasNext()){LsEntry entry = (LsEntry) it.next();String filename = entry.getFilename();SftpATTRS attrs = entry.getAttrs();if (!attrs.isDir()){boolean flag = false;String localFileName = localPath + filename;fileFormat = fileFormat == null ? "" : fileFormat.trim();fileEndFormat = fileEndFormat == null ? "": fileEndFormat.trim();// 三种情况if (fileFormat.length() > 0 && fileEndFormat.length() > 0){if (filename.startsWith(fileFormat) && filename.endsWith(fileEndFormat)){flag = downloadFile(remotePath, filename,localPath, filename);if (flag){filenames.add(localFileName);if (flag && del){deleteSFTP(remotePath, filename);}}}}else if (fileFormat.length() > 0 && "".equals(fileEndFormat)){if (filename.startsWith(fileFormat)){flag = downloadFile(remotePath, filename, localPath, filename);if (flag){filenames.add(localFileName);if (flag && del){deleteSFTP(remotePath, filename);}}}}else if (fileEndFormat.length() > 0 && "".equals(fileFormat)){if (filename.endsWith(fileEndFormat)){flag = downloadFile(remotePath, filename,localPath, filename);if (flag){filenames.add(localFileName);if (flag && del){deleteSFTP(remotePath, filename);}}}}else{flag = downloadFile(remotePath, filename,localPath, filename);if (flag){filenames.add(localFileName);if (flag && del){deleteSFTP(remotePath, filename);}}}}}}if (log.isInfoEnabled()){log.info("download file is success:remotePath=" + remotePath+ "and localPath=" + localPath + ",file size is"+ v.size());}}catch (SftpException e){e.printStackTrace();}finally{// this.disconnect();}return filenames;}/*** 下载单个文件* @param remotPath:远程下载目录(以路径符号结束)* @param remoteFileName:下载文件名* @param localPath:本地保存目录(以路径符号结束)* @param localFileName:保存文件名* @return*/public boolean downloadFile(String remotePath, String remoteFileName,String localPath, String localFileName){FileOutputStream fieloutput = null;try{// sftp.cd(remotePath);File file = new File(localPath + localFileName);// mkdirs(localPath + localFileName);fieloutput = new FileOutputStream(file);sftp.get(remotePath + remoteFileName, fieloutput);if (log.isInfoEnabled()){log.info("===DownloadFile:" + remoteFileName + " success from sftp.");}return true;}catch (FileNotFoundException e){e.printStackTrace();}catch (SftpException e){e.printStackTrace();}finally{if (null != fieloutput){try{fieloutput.close();}catch (IOException e){e.printStackTrace();}}}return false;}/*** 上传单个文件* @param remotePath:远程保存目录* @param remoteFileName:保存文件名* @param localPath:本地上传目录(以路径符号结束)* @param localFileName:上传的文件名* @return*/public boolean uploadFile(String remotePath, String remoteFileName,String localPath, String localFileName){FileInputStream in = null;try{createDir(remotePath);File file = new File(localPath + localFileName);in = new FileInputStream(file);sftp.put(in, remoteFileName);return true;}catch (FileNotFoundException e){e.printStackTrace();}catch (SftpException e){e.printStackTrace();}finally{if (in != null){try{in.close();}catch (IOException e){e.printStackTrace();}}}return false;}/*** 批量上传文件* @param remotePath:远程保存目录* @param localPath:本地上传目录(以路径符号结束)* @param del:上传后是否删除本地文件* @return*/public boolean bacthUploadFile(String remotePath, String localPath,boolean del){try{connect();File file = new File(localPath);File[] files = file.listFiles();for (int i = 0; i < files.length; i++){if (files[i].isFile()&& files[i].getName().indexOf("bak") == -1){if (this.uploadFile(remotePath, files[i].getName(),localPath, files[i].getName())&& del){deleteFile(localPath + files[i].getName());}}}if (log.isInfoEnabled()){log.info("upload file is success:remotePath=" + remotePath+ "and localPath=" + localPath + ",file size is "+ files.length);}return true;}catch (Exception e){e.printStackTrace();}finally{this.disconnect();}return false;}/*** 删除本地文件* @param filePath* @return*/public boolean deleteFile(String filePath){File file = new File(filePath);if (!file.exists()){return false;}if (!file.isFile()){return false;}boolean rs = file.delete();if (rs && log.isInfoEnabled()){log.info("delete file success from local.");}return rs;}/*** 创建目录* @param createpath* @return*/public boolean createDir(String createpath){try{if (isDirExist(createpath)){this.sftp.cd(createpath);return true;}String pathArry[] = createpath.split("/");StringBuffer filePath = new StringBuffer("/");for (String path : pathArry){if (path.equals("")){continue;}filePath.append(path + "/");if (isDirExist(filePath.toString())){sftp.cd(filePath.toString());}else{// 建立目录sftp.mkdir(filePath.toString());// 进入并设置为当前目录sftp.cd(filePath.toString());}}this.sftp.cd(createpath);return true;}catch (SftpException e){e.printStackTrace();}return false;}/*** 判断目录是否存在* @param directory* @return*/public boolean isDirExist(String directory){boolean isDirExistFlag = false;try{SftpATTRS sftpATTRS = sftp.lstat(directory);isDirExistFlag = true;return sftpATTRS.isDir();}catch (Exception e){if (e.getMessage().toLowerCase().equals("no such file")){isDirExistFlag = false;}}return isDirExistFlag;}/*** 删除stfp文件* @param directory:要删除文件所在目录* @param deleteFile:要删除的文件* @param sftp*/public void deleteSFTP(String directory, String deleteFile){try{// sftp.cd(directory);sftp.rm(directory + deleteFile);if (log.isInfoEnabled()){log.info("delete file success from sftp.");}}catch (Exception e){e.printStackTrace();}}/*** 如果目录不存在就创建目录* @param path*/public void mkdirs(String path){File f = new File(path);String fs = f.getParent();f = new File(fs);if (!f.exists()){f.mkdirs();}}/*** 列出目录下的文件* * @param directory:要列出的目录* @param sftp* @return* @throws SftpException*/public Vector listFiles(String directory) throws SftpException{return sftp.ls(directory);}public String getHost(){return host;}public void setHost(String host){this.host = host;}public String getUsername(){return username;}public void setUsername(String username){this.username = username;}public String getPassword(){return password;}public void setPassword(String password){this.password = password;}public int getPort(){return port;}public void setPort(int port){this.port = port;}public ChannelSftp getSftp(){return sftp;}public void setSftp(ChannelSftp sftp){this.sftp = sftp;}/*** * 功能说明:获取远程服务路劲下的文件名称* @param parameters* @return* @throws SftpException*/public static List<String> getAllFilename(SftpParameters parameters){SFTPUtils sftp = null;List<String> fileList= new ArrayList<String>();sftp = new SFTPUtils(parameters.getServerIp(), parameters.getUserName(), parameters.getPassword());sftp.connect();Vector v;try {v = sftp.listFiles(parameters.getRemoteFilePath());Iterator it = v.iterator();while (it.hasNext()) {LsEntry entry = (LsEntry) it.next();String filename = entry.getFilename();if(filename.endsWith("end")){fileList.add(filename);}}} catch (SftpException e) {e.printStackTrace();}finally{sftp.disconnect();}return fileList;}public static List<String> getAll(SftpParameters parameters){SFTPUtils sftp = null;List<String> fileList= new ArrayList<String>();sftp = new SFTPUtils(parameters.getServerIp(), parameters.getUserName(), parameters.getPassword());sftp.connect();Vector v;try {v = sftp.listFiles(parameters.getRemoteFilePath());log.info("当前服务器文件清单----{}",JSONObject.toJSONString(v));Iterator it = v.iterator();while (it.hasNext()) {LsEntry entry = (LsEntry) it.next();String filename = entry.getFilename();if(filename.endsWith("end") || filename.endsWith("zip") || filename.endsWith("sign")){fileList.add(filename);}}} catch (SftpException e) {e.printStackTrace();}finally{sftp.disconnect();}return fileList;}/*** * 功能说明:单个文件下载 * @param parameters* @return*/public static  boolean down(SftpParameters parameters){SFTPUtils sftp = null;boolean result= false;try {sftp = new SFTPUtils(parameters.getServerIp(), parameters.getUserName(), parameters.getPassword());sftp.connect();result = sftp.downloadFile(parameters.getRemoteFilePath(),parameters.getRemoteFileName(),parameters.getLocalFilePath(),parameters.getRemoteFileName());sftp.deleteSFTP(parameters.getRemoteFilePath(),parameters.getRemoteFileName());} catch (Exception e) {e.printStackTrace();}finally{sftp.disconnect();}return result;}/*** * 功能说明:单个文件上传* @param parameters* @return*/public static  boolean  upload(SftpParameters parameters){SFTPUtils sftp = null;boolean result =false;try {sftp = new SFTPUtils(parameters.getServerIp(), parameters.getUserName(), parameters.getPassword());sftp.connect();result = sftp.uploadFile(parameters.getRemoteFilePath(), parameters.getRemoteFileName(),parameters.getLocalFilePath(), parameters.getLocalFileName());} catch (Exception e) {e.printStackTrace();}finally{sftp.disconnect();}return result;}/**测试*/public static void main(String[] args){SFTPUtils sftp = new SFTPUtils("192.168.8.157", "root", "654321");sftp.connect();try {System.out.println(JSONObject.toJSONString(sftp.listFiles("/alidata1/logs/cslsws-mock/logs")));sftp.downloadFile("/alidata1/logs/cslsws-mock/logs/", "monitor_cslsws-mock-2017-12-18.log", "C:\\Users\\songcs\\Desktop\\worktmp\\aa\\", "monitor_cslsws-mock-2017-12-18.log");} catch (SftpException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{sftp.disconnect();}System.out.println("end==========");/*SFTPUtils sftp = null;// 本地存放地址String localPath = "D:/upload/win/";// Sftp下载路径String sftpPath = "/upload/win/";List<String> filePathList = new ArrayList<String>();try{sftp = new SFTPUtils("192.168.8.148", "mysftp", "mypasswd");sftp.connect();// 下载Vector v =sftp.listFiles("/upload/win/");Iterator it = v.iterator();while (it.hasNext()) {LsEntry entry = (LsEntry) it.next();String filename = entry.getFilename();System.out.println(filename);}sftp.batchDownLoadFile(sftpPath, localPath, "11", ".txt", true);sftp.downloadFile(sftpPath,localPath,"","");}catch (Exception e){e.printStackTrace();}finally{sftp.disconnect();}*/}
}

sftp utils相关推荐

  1. springBoot整合sftp

    springBoot整合sftp 1.引入依赖,pom文件添加依赖. <dependency><groupId>com.jcraft</groupId><ar ...

  2. 使用 JAVA Swing 构建 Sftp 桌面连接工具

    技术要点 将 logback 日志输出到 Swing 组件上. 使 jsch.jar 包连接 sftp 服务器.实现文件的上传下载. 最终是为了实现文件自动同步. 步骤一.将logback日志输出到S ...

  3. 文件系统之-JAVA Sftp远程操作:

    转载:http://blog.csdn.net/lee272616/article/details/52789018 java远程操作文件服务器(linux),使用sftp协议 版本会持续更新, 当前 ...

  4. sftp文件上传下载改名压缩解压

    希望能帮到大家,有疑问联系 package com.qb.modules.organtrans.interactive.jinshang;import java.io.File; import jav ...

  5. java使用sftp上传(文件)图片到服务器中

    最近租了一个服务器,想着上线个小项目,结果图片上传卡壳了,自从11号看了一篇文章就入了ftp的坑.研究了十多个小时的ftp文件传输,无果.睡前看到了一篇关于sftp上传文件的文章,抱着试一试的心态,结 ...

  6. LINUX搭建SFTP服务器及脚本上行下载

    前言:公司业务中,需要我方搭建sftp服务器用来三方交换数据,而且其中一方是win10专线,所以还需在本地写上行与下载脚本 一.创建一个组(sftp) groupadd sftp (删除使用group ...

  7. 【Java工具类】(22)—服务器传文件工具类SCp和Sftp

    Java工具类(22)-服务器传文件工具类SCp和Sftp 1.Scp package com.awifi.capacity.docker.manager.utils;import ch.ethz.s ...

  8. 手把手教你java实现sftp上传文件到linux服务器

    1.首先引入pom文件依赖 <dependency><groupId>com.jcraft</groupId><artifactId>jsch</ ...

  9. 在Java中实现SFTP协议文件传输的两种解决方案

    在Java中实现SFTP协议文件传输的两种解决方案 1.1 背景 1.2 关于 FTP /FTPS 1.3 关于SFTP 解决方案一:使用 JSch 库 解决方案二:使用sshj 库 这篇博文来聊聊在 ...

最新文章

  1. 多台linux无密码访问之方法二
  2. Windows Mobile和Wince(Windows Embedded CE)的字符集问题
  3. 阅读日志:协鑫一年的多晶硅料产能能够生产做少装机容量的组件?
  4. 广州谋定营养功能性早餐-丰收节交易会·李喜贵:系统工程
  5. Linux系统的压缩技术
  6. 动态生成Repeater
  7. Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期
  8. python 如何定义空字典_python字典中如何添加键值对
  9. VSCode 实时预览HTML网页效果 - Live Server插件
  10. python语言入门-python语言入门资料
  11. hive建表报错JsonSerDe
  12. HP520 笔记本 驱动安装的一些问题
  13. 使用3DMM进行人脸重建中的配准方法
  14. python wordcloud 对电影《我不是潘金莲》制作词云
  15. BUUCTF misc 解题记录 一(超级详细)
  16. 京东数据化运营(三)- 复购率
  17. JavaWeb HTML
  18. java 登录注册小程序
  19. 网络编程面试汇总(C++)
  20. 理论基础篇 -- 【计算机网络通关29讲笔记】

热门文章

  1. 3台计算机能组家庭组吗,win7如何启用家庭组图文教程
  2. 关于IBV_WR_RDMA_WRITE_WITH_IMM的理解
  3. 各国家域名总量统计Top10:美国德国中国居前三
  4. MMP7人源全长重组蛋白说明书
  5. Elasticsearch 模块-Shard Allocation 机制
  6. C语言程序设计第4章节练习题
  7. Taffy DB : A JavaScript database for your browser
  8. 用python自动发送邮件(139邮箱——qq邮箱)报错,求解
  9. 罗列计数器(工具类)
  10. 谷歌蜘蛛池-悟空蜘蛛池