广告位联系
返回顶部
分享到

java使用JSCH实现SFTP文件管理的方法

python 来源:互联网搜集 作者:秩名 发布时间:2019-08-16 22:20:36 人浏览
摘要

一、连接配置 1.在项目中导入jsch-0.1.51.jar包; 2.创建SFTP类,存放连接属性,其中要注意一点,在进行FTP操作时,一个会话在建立连接通道后进入A目录进行文件操作,不能直接跳到同级或上级目录操作,需要先退出当前会话或者新建会话。 public class 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<String> 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<String> fileNameList = new ArrayList<String>();
 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 <String> 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);
 }
 }


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://blog.csdn.net/u012909738/article/details/74328669
相关文章
  • Python Django教程之实现新闻应用程序

    Python Django教程之实现新闻应用程序
    Django是一个用Python编写的高级框架,它允许我们创建服务器端Web应用程序。在本文中,我们将了解如何使用Django创建新闻应用程序。 我们将
  • 书写Python代码的一种更优雅方式(推荐!)

    书写Python代码的一种更优雅方式(推荐!)
    一些比较熟悉pandas的读者朋友应该经常会使用query()、eval()、pipe()、assign()等pandas的常用方法,书写可读性很高的「链式」数据分析处理代码
  • Python灰度变换中伽马变换分析实现

    Python灰度变换中伽马变换分析实现
    1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形
  • 使用OpenCV实现迷宫解密的全过程

    使用OpenCV实现迷宫解密的全过程
    一、你能自己走出迷宫吗? 如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜
  • Python中的数据精度问题的介绍

    Python中的数据精度问题的介绍
    一、python运算时精度问题 1.运行时精度问题 在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
  • Python随机值生成的常用方法

    Python随机值生成的常用方法
    一、随机整数 1.包含上下限:[a, b] 1 2 3 4 import random #1、随机整数:包含上下限:[a, b] for i in range(10): print(random.randint(0,5),end= | ) 查看运行结
  • Python字典高级用法深入分析讲解
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python浅析多态与鸭子类型使用实例
    什么多态:同一事物有多种形态 为何要有多态=》多态会带来什么样的特性,多态性 多态性指的是可以在不考虑对象具体类型的情况下而直
  • Python字典高级用法深入分析介绍
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本

    Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本
    我们的目标是秒杀淘宝或京东等的订单,这里面有几个关键点,首先需要登录淘宝或京东,其次你需要准备好订单,最后要在指定时间快速
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计