使用JSch实现SFTP文件传输

1、JSch开发包下载

http://www.jcraft.com/jsch/

目前最新版本为: jsch - 0.1.51

2、简单例子,列出指定目录下的文件列表

import  java.util.Properties;

import  java.util.Vector;

import  com.jcraft.jsch.ChannelSftp;

import  com.jcraft.jsch.JSch;

import  com.jcraft.jsch.Session;

public   class  Demo003 {

/**

*  @param args

*/

public static void main(String[] args)  throws Exception{

JSch jsch =  new JSch();

Session session = jsch.getSession( "cmb" ,  "localhost" );

session.setPassword( "cmb123" );

Properties config =  new Properties();

config.put( "StrictHostKeyChecking" ,  "no" );

session.setConfig(config);

session.connect();

ChannelSftp channelSftp = (ChannelSftp)session.openChannel( "sftp" );

channelSftp.connect();

channelSftp.setFilenameEncoding( "gbk" );

Vector vector  = channelSftp.ls( "/" );

try {

for (Object obj :vector){

if (obj  instanceof com.jcraft.jsch.ChannelSftp.LsEntry){

String fileName = ((com.jcraft.jsch.ChannelSftp.LsEntry)obj).getFilename();

System. out .println(fileName);

}

}

}

finally {

channelSftp.quit();

session.disconnect();

}

}

}

3、JSch实现SFTP功能一些主要 类的介绍

1)JSch 类

2)Session 会话对象类

3) ChannelSFTP类

ChannelSFTP类是JSch实现SFTP核心类,它提供了一些SFTP常见的操作方法,如下

方法名方法说明
put()文件上传
get()文件下载
cd()   
进入指定目录
ls()   
得到指定目录下的文件列表
rename() 
重命名(移动)指定文件或目录
rm()   
删除指定文件
mkdir()    
创建目录
rmdir()   
删除目录(只允许删除空目录)

注:以上这些方法都有很多重载方法

4) SftpProgressMonitor 传输进度监控类

5) LsEntry 可以认为是文件服务器上的文件条目信息,把包含文件或者目录相关属性 。ls命令返回的Vector中的就是LsEntry对象列表

4、SFTP文件传输的实现步骤

//1、创建JSch类,好比是FlashFXP工具

JSch jsch =  new JSch();

//2、创建本次的文件传输会话对象,并连接到SFTP服务器。它好比是通过FlashFXP工具连接到SFTP服务器

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

session .setPassword(passwd);

Properties config =  new Properties();

config.put( "StrictHostKeyChecking" ,  "no" );

session .setConfig(config);

session .connect();

try {

//3、在该session会话中开启一个SFTP通道,之后就可以在该通道中进行文件传输了

channelSftp = (ChannelSftp) session .openChannel( "sftp" );

channelSftp .connect();

} catch (Exception e){

e.printStackTrace();

disConnect();

throw e;

}

//4、进行文件传输操作:put()、get()....

channelSftp . put( ...)

//5、操作完毕后,关闭通道并退出本次会话

if (channelSftp!= null && channelSftp.isConnected()){

channelSftp.disconnect();

}

if (session!= null && session.isConnected()){

session.disconnect();

}

5、JSch中文乱码处理

     使用 jsch -0.1.51进行SFTP文件传输时,对中文处理会出现乱码,并且也无法通过setFileNameEncoding()方法来设置编码。

     解决方案:

         下载 jsch -0.1.51源代码,在 ChannelSFTP.java文件中找到SENDINIT( )方法,修改红色部分的内容

  private void sendINIT() throws Exception {

 

this.packet.reset();

putHEAD((byte)1, 5);

this.buf.putInt(3);   //修改为   this.buf.putInt( 2 );

getSession().write(this.packet, this, 9);

}

然后编译并更改jar中的对应class文件即可。

 

 

6、ChannelSftp类的主要API说明如下:

方法名方法说明
public void put(String src, String dst)将本地文件名为 src 的文件上传到目标服务器,目标文件名为 dst ,若 dst 为目录,则目标文件名将与src 文件名相同。采用默认的传输模式: OVERWRITE
public void put(String src, String dst, int mode)将本地文件名为 src 的文件上传到目标服务器,目标文件名为 dst ,若 dst 为目录,则目标文件名将与src 文件名相同。指定文件传输模式为 mode ( mode 可选值为:ChannelSftp.OVERWRITE ,ChannelSftp.RESUME ,ChannelSftp.APPEND )。
public void put(String src, String dst, SftpProgressMonitor monitor)将本地文件名为 src 的文件上传到目标服务器,目标文件名为 dst ,若 dst 为目录,则目标文件名将与src 文件名相同。采用默认的传输模式: OVERWRITE ,并使用实现了 SftpProgressMonitor 接口的monitor 对象来监控文件传输的进度。
public void put(String src, String dst,SftpProgressMonitor monitor, int mode)将本地文件名为 src 的文件上传到目标服务器,目标文件名为 dst ,若 dst 为目录,则目标文件名将与src 文件名相同。指定传输模式为mode, 并使用实现了SftpProgressMonitor 接口的monitor 对象来监控文件传输的进度。
public void put(InputStream src, String dst)将本地的 input stream 对象 src 上传到目标服务器,目标文件名为dst , dst 不能为目录。采用默认的传输模式: OVERWRITE
public void put(InputStream src, String dst, int mode)将本地的 input stream 对象 src上传到目标服务器,目标文件名为 dst , dst 不能为目录。指定文件传输模式为mode
public void put(InputStream src, String dst, SftpProgressMonitor monitor)将本地的 input stream 对象 src 上传到目标服务器,目标文件名为dst , dst 不能为目录。采用默认的传输模式: OVERWRITE 。并使用实现了 SftpProgressMonitor接口的 monitor 对象来监控传输的进度。
public void put(InputStream src, String dst,SftpProgressMonitor monitor, int mode)将本地的 input stream 对象 src 上传到目标服务器,目标文件名为dst , dst 不能为目录。指定文件传输模式为 mode 。并使用实现了SftpProgressMonitor 接口的monitor 对象来监控传输的进度。
public OutputStream put(String dst)该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst , dst 不能为目录。采用默认的传输模式: OVERWRITE
public OutputStream put(String dst, final int mode)该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为 dst , dst不能为目录。指定文件传输模式为 mode
public OutputStream put(String dst, final SftpProgressMonitor monitor, final int mode)该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst , dst 不能为目录。指定文件传输模式为 mode 。并使用实现了SftpProgressMonitor 接口的monitor 对象来监控传输的进度。
public OutputStream put(String dst, final SftpProgressMonitor monitor, final int mode, long offset)该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst , dst 不能为目录。指定文件传输模式为 mode 。并使用实现了SftpProgressMonitor 接口的monitor 对象来监控传输的进度。offset 指定了一个偏移量,从输出流偏移 offset 开始写入数据。
get(String src, String dst)下载文件到本地, src 为目标服务器上的文件,不能为目录, dst 为本地文件路径。若 dst 为目录,则本地文件名与目标服务器上的文件名一样。
get(String src, String dst ,SftpProgressMonitor monitor)同get(String src, String dst),只是该方法允许传入传输进度的监控对象monitor。
get(String src, String dst ,SftpProgressMonitor monitor ,int mode)同 get(String src, String dst ,SftpProgressMonitor monitor) ,同时,该方法增加了 mode 参数,允许指定文件传输模式
rm(String path)删除文件, path 不能为目录,删除目录使用 rmdir
rmdir(String path)删除目录,但是只能删除空目录
rename(String oldpath, String newpath)如果oldPath为目录,不要求目录必须为空 
如果newpath为目录,则newpath必须不能存在,如果已经存在该目录,则会出现重名或者移动失败 
1、重命名文件或者目录 
2、移动文件或者目录
ls(String path)列出指定目录下的所有文件和子目录。该方法返回 Vector 对象,该列表具体存放的是 LsEntry 对象

转载于:https://www.cnblogs.com/likeju/p/5108763.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSch是一个Java库,用于在Java程序中连接和操作SFTP服务器。通过JSch,你可以使用SFTP协议在本地和远程服务器之间传输文件。下面是一个使用JSch连接SFTP服务器的示例代码: ```java JSch jsch = new JSch(); Session session = jsch.getSession("username", "hostname", port); session.setPassword("password"); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); ChannelSftp sftp = (ChannelSftp) channel; // 在这里可以执行SFTP操作,比如上传、下载、删除文件等 channel.disconnect(); session.disconnect(); ``` 以上代码中,你需要替换`username`、`hostname`、`port`和`password`为你实际的SFTP服务器的用户名、主机名、端口和密码。通过调用`session.connect()`方法建立与服务器的连接,然后通过`session.openChannel("sftp")`打开SFTP通道,最后通过`channel.connect()`连接到SFTP服务器。你可以在这个连接上执行各种SFTP操作,比如上传、下载、删除文件等。最后,通过`channel.disconnect()`和`session.disconnect()`关闭连接。 如果你想读取服务器上指定路径下的所有文件,可以使用以下代码: ```java Vector<ChannelSftp.LsEntry> files = sftp.ls("/path/to/directory"); for (ChannelSftp.LsEntry file : files) { String filename = file.getFilename(); boolean isDirectory = file.getAttrs().isDir(); System.out.println(filename + " is a directory: " + isDirectory); } ``` 以上代码中,你需要将`/path/to/directory`替换为你想要读取的目录路径。通过调用`sftp.ls()`方法可以获取指定路径下的所有文件文件夹的信息,然后通过遍历`files`列表可以获取每个文件的名称和是否是文件夹。 请注意,使用JSch连接SFTP服务器需要添加相应的依赖。你可以在你的项目的`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency> ``` 这样,你就可以使用JSch库连接SFTP服务器并执行相应的操作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值