使用jsch实现SFTP文件传输
1、环境搭建
这里使用maven管理项目,所以第一步需要先导入相关的依赖,第一步:安装vsftpd提供ftp服务(注意跟xftp不同,协议与端口都不同)
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
2、简单例子,列出指定目录下的文件列表
/** * 列出目录下的文件 * * @param directory * 要列出的目录 * @paramsftp * @return * @throwsSftpException */
publicVectorlistFiles(String directory, ChannelSftpsftp) throwsSftpException {
returnsftp.ls(directory);
}
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文件传输的实现步骤
/** * 上传文件 * * @param directory * 上传的目录 * @paramuploadFile * 要上传的文件 * @paramsftp */
publicvoid upload(String directory, String uploadFile, ChannelSftpsftp) {
try {
sftp.cd(directory);
File file = new File(uploadFile);
sftp.put(newFileInputStream(file), file.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
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文件即可。
还没有评论,来说两句吧...