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说明如下:

太多就不贴了。。。。


本文转自:http://www.cnblogs.com/itmanxgl/p/fe5d33512609fe540eb08a76e3c4db3a.html?utm_source=tuicool&utm_medium=referral

感谢作者分享!