本文实例为大家分享了java使用JSCH实现SFTP文件管理的具体代码,供大家参考,具体内容如下

一、连接配置

1.在项目中导入jsch-0.1.51.jar包;

2.创建SFTP类,存放连接属性,其中要注意一点,在进行FTP操作时,一个会话在建立连接通道后进入A目录进行文件操作,不能直接跳到同级或上级目录操作,需要先退出当前会话或者新建会话。

public class SFTP{

private Session session;//会话

private Channel channel;//连接通道

private ChannelSftp sftp;// sftp操作类

public Session getSession() {

return session;

}

public void setSession(Session session) {

this.session = session;

}

public Channel getChannel() {

return channel;

}

public void setChannel(Channel channel) {

this.channel = channel;

}

public ChannelSftp getSftp() {

return sftp;

}

public void setSftp(ChannelSftp sftp) {

this.sftp = sftp;

}

}

3.创建SFTPUtil类,创建连接配置方法

/**

* 连接ftp/sftp服务器

* @param SFTP类

*/

public static void getConnect(SFTP s) throws Exception {

/** 密钥的密码 */

// String privateKey ="key";

// /** 密钥文件路径 */

// String passphrase ="path";

/** 主机 */

String host ="127.0.0.1";

/** 端口 */

int port =22;

/** 用户名 */

String username ="test";

/** 密码 */

String password ="test";

Session session = null;

Channel channel = null;

ChannelSftp sftp = null;// sftp操作类

JSch jsch = new JSch();

//设置密钥和密码

//支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了

// if (privateKey != null && !"".equals(privateKey)) {

// if (passphrase != null && "".equals(passphrase)) {

// //设置带口令的密钥

// jsch.addIdentity(privateKey, passphrase);

// } else {

// //设置不带口令的密钥

// jsch.addIdentity(privateKey);

// }

// }

session = jsch.getSession(username, host, port);

session.setPassword(password);

Properties config = new Properties();

config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey

session.setConfig(config);

try {

session.connect();

} catch (Exception e) {

if (session.isConnected())

session.disconnect();

log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port

+ "],用户名[" + username + "],端口[" + port

+ "]是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");

}

channel = session.openChannel("sftp");

try {

channel.connect();

} catch (Exception e) {

if (channel.isConnected())

channel.disconnect();

log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port

+ "],用户名[" + username + "],密码是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");

}

sftp = (ChannelSftp) channel;

s.setChannel(channel);

s.setSession(session);

s.setSftp(sftp);

}

5.关闭连接方法

/**

* 断开连接

*

*/

public static void disConn(Session session,Channel channel,ChannelSftp sftp)throws Exception{

if(null != sftp){

sftp.disconnect();

sftp.exit();

sftp = null;

}

if(null != channel){

channel.disconnect();

channel = null;

}

if(null != session){

session.disconnect();

session = null;

}

}

二、SFTP目录、文件操作管理

1.上传文件

/**

* 上传文件

* @param directory 上传的目录-相对于SFPT设置的用户访问目录,

* 为空则在SFTP设置的根目录进行创建文件(除设置了服务器全磁盘访问)

* @param uploadFile 要上传的文件全路径

*/

public static void upload(String directory,String uploadFile) throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

try{

sftp.cd(directory); //进入目录

}catch(SftpException sException){

if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){ //指定上传路径不存在

sftp.mkdir(directory);//创建目录

sftp.cd(directory); //进入目录

}

}

}

File file = new File(uploadFile);

InputStream in= new FileInputStream(file);

sftp.put(in, file.getName());

in.close();

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

2.文件下载

/**

* 下载文件

* @param directory 下载目录 根据SFTP设置的根目录来进行传入

* @param downloadFile 下载的文件

* @param saveFile 存在本地的路径

*/

public static void download(String directory, String downloadFile,String saveFile) throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

sftp.cd(directory); //进入目录

File file = new File(saveFile);

boolean bFile;

bFile = false;

bFile = file.exists();

if (!bFile) {

bFile = file.mkdirs();//创建目录

}

OutputStream out=new FileOutputStream(new File(saveFile,downloadFile));

sftp.get(downloadFile, out);

out.flush();

out.close();

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

3.删除文件

/**

* 删除文件

* @param directory 要删除文件所在目录

* @param deleteFile 要删除的文件

*/

public static void delete(String directory, String deleteFile) throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

sftp.cd(directory); //进入的目录应该是要删除的目录的上一级

sftp.rm(deleteFile);//删除目录

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

4.列出目录下的文件

/**

* 列出目录下的文件

* @param directory 要列出的目录

* @return list 文件名列表

* @throws Exception

*/

public static List listFiles(String directory) throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

Vector fileList=null;

List fileNameList = new ArrayList();

fileList = sftp.ls(directory); //返回目录下所有文件名称

disConn(session,channel,sftp);

Iterator it = fileList.iterator();

while(it.hasNext()) {

String fileName = ((LsEntry)it.next()).getFilename();

if(".".equals(fileName) || "..".equals(fileName)){

continue;

}

fileNameList.add(fileName);

}

return fileNameList;

}

5.删除目录下所有文件

/**

* 删除目录下所有文件

* @param directory 要删除文件所在目录

*/

public static void deleteAllFile(String directory) throws Exception{

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

List files=listFiles(directory);//返回目录下所有文件名称

sftp.cd(directory); //进入目录

for (String deleteFile : files) {

sftp.rm(deleteFile);//循环一次删除目录下的文件

}

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

6.删除目录 (删除的目录必须为空)

/**

* 删除目录 (删除的目录必须为空)

* @param deleteDir 要删除的目录

*/

public static void deleteDir(String deleteDir) throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

sftp.rmdir(deleteDir);

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

7.创建目录

/**

* 创建目录

* @param directory 要创建的目录 位置

* @param dir 要创建的目录

*/

public static void creatDir(String directory,String dir) throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

sftp.cd(directory);

sftp.mkdir(dir);

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

8.更改文件名

/**

* 更改文件名

* @param directory 文件所在目录

* @param oldFileNm 原文件名

* @param newFileNm 新文件名

* @throws Exception

*/

public static void rename(String directory, String oldFileNm, String newFileNm) throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

sftp.cd(directory);

sftp.rename(oldFileNm, newFileNm);

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

9.进入目录

/**

* 进入目录

* @param directory

* @throws Exception

*/

public static void cd(String directory)throws Exception {

SFTP s=new SFTP();

getConnect(s);//建立连接

Session session = s.getSession();

Channel channel = s.getChannel();

ChannelSftp sftp = s.getSftp();// sftp操作类

try {

sftp.cd(directory); //目录要一级一级进

} catch (Exception e) {

throw new Exception(e.getMessage(),e);

} finally {

disConn(session,channel,sftp);

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java jsch_java使用JSCH实现SFTP文件管理相关推荐

  1. java jsch_java - 使用JSch在远程计算机上执行命令

    SSH是访问远程计算机,传输数据和执行远程命令的一种简单而安全的方法.除了基础的交互模式外,还有许多依赖于ssh Client/Server架构的工具可以实现自动化执行远程任务.我们可以找到ssh客户 ...

  2. java jsch_java – 使用JSch的多个命令

    我的要求如下: 我必须使用我的凭据登录Unix框,登录后,我必须对不同的用户做sudo.一旦sudo成功,我必须在nohup中调用 shell.完成执行后,关闭通道和会话. 我尝试了使用sudo命令连 ...

  3. java jsch_java 利用jsch端口转发 建立连接

    其他代码都一样,参照< 使用JSch完成 ssh隧道建立> 只有获取连接的部分不相同. 代码如下: // 端口转发 // 链接两层 public boolean connect() thr ...

  4. java jsch api_详解Java使用Jsch与sftp服务器实现

    在实际项目中常会遇到需要连接服务器获取文件的场景,如账务系统需要通过连接行方的sftp服务器拉取回单文件.本文将主要讨论使用Java中的jsch与sftp服务器实现ssh免密连接. 一.什么是SFTP ...

  5. java jsch实现sftp文件上传,并且控制上传的速度,同时监控上传进度

    工作中,有些环境带宽有限,比如说专线,通常带宽比较小,又不便宜,当业务量大的时间,如果在专线上还要传输文件的话,往往在文件传输的时间会导致带宽占慢,就有可能导致时实交易进不来,有可能影响交易,今天贴一 ...

  6. java使用jsch连接sftp报permission denied问题

    在生产环境上,使用jsch的sftp.get(filepath,byteArrayOutputStream)时,报出了以下错误 因为是用其他账号登录,所以没有文件权限.

  7. java ssh jsch_Java使用jsch远程连接ssh

    概念:JSch是SSH2的纯Java实现.JSch允许连接到sshd服务器并使用端口转发,X11转发,文件传输等,并且可以将其功能集成到您自己的Java程序中. 说白了就是以java的方式通过jsch ...

  8. SFTP例子2----使用JSch实现SFTP文件传输

    1.JSch开发包下载 http://www.jcraft.com/jsch/ 目前最新版本为:jsch-0.1.51 2.简单例子,列出指定目录下的文件列表 import java.util.Pro ...

  9. sftp api java_SFTP例子2----使用JSch实现SFTP文件传输

    1.JSch开发包下载 目前最新版本为:jsch-0.1.51 2.简单例子,列出指定目录下的文件列表import java.util.Properties; import java.util.Vec ...

最新文章

  1. python 遍历字典
  2. centos6配置日志外发_CentOS6下记录后台操作日志的两种方式
  3. php数组去空函数怎么写,分享php数组去除空值函数
  4. 怎么能把看不清的照片给看清_远视怎么矫正?需要佩戴眼镜吗?
  5. 漫谈MySQL权限安全,威力加强版
  6. 【转】30种MySQL索引优化的方法
  7. Apache HttpComponents在App里访问HTTP服务
  8. #54 partition a sequence
  9. Cilium创建pod network源码解析
  10. 微信小程序保存图片拒绝授权后的操作
  11. typeof应该注意的地方(网龙公司校招笔试题)
  12. 十亿级同步,百亿级调用,千亿级访问量的开放技术平台如何炼成?
  13. linux中tomcat日志文件含义
  14. div+js写弹出框
  15. c语言java异或区别_C、C++、Java异或运算交换变量变量值的区别
  16. 笔记本电脑无法使用WiFi上网解答
  17. 本地文件上传到github上
  18. 经营分析师如何进一步提升自己的境界
  19. 大学临近结束回望高中
  20. 使用js在桌面上写一个倒计时器_现代课程网教学互动平台课件编辑器:计时器、倒计时器(图文版)...

热门文章

  1. 基于点云的3D深度学习主干网络进展综述
  2. 基克的聚合 机器人_新版本辅助装大改 基克的聚合不能错过
  3. wangEditor 上传图片,回调函数 Cannot read properties of undefined
  4. mysql数据库忘记密码
  5. cocos code ide 导入cocos2d-js自带的实例
  6. KDD 2019 | 结合属性随机游走的图递归网络
  7. 【错误归纳】selenium.common.exceptions.WebDriverException: Message: unknown error
  8. php接口 汉字出错 空,php接口开发时,数据解析失败问题,字符转义,编码问题(示例代码)...
  9. hpm128无法共享打印_办公室打印机如何共享给同事使用呢?常见共享打印问题及解决方法...
  10. 为什么 SSH 的默认端口是 22 ?