JSCH SFTP 文件下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiewendong93/article/details/53841682

JSCH SFTP


  • 简单优雅 , 灵活的配置
  • 复制即可执行
  • 能解决org.apache.commons.net.ftp.FTPClient通过协议SSH2进行SFTP连接时,远端不支持SSH2这种方式的连接的错误
  • Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3

POM


        <!--JSCH FTP-->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.49</version>
        </dependency>

配置: importDB.properties


# SFTP 信息
#.远程数据文件下载
# 1.Ip
# 2.Port
# 3.UserName
# 4.PassWord
# 5.目标文件
# 6.本地文件
SFTP_HOST=xxx.xx.xx.xxx
SFTP_PORT=22
SFTP_USERNAME=xxxx
SFTP_PASSWORD=xxxx
SFTP_REMOTE_PATH=/root/zip.zip
SFTP_LOCAL_PATH=D:\\zip.zip

功能实现


import java.io.InputStream;
import java.util.Properties;
import com.jcraft.jsch.*;

public class SFTPGetTest {

    /* SFTP 连接信息 */
    private static String SFTP_HOST;
    private static Integer SFTP_PORT;
    private static String SFTP_USERNAME;
    private static String SFTP_PASSWORD;
    /* 目标文件与下载地址 */
    private static String SFTP_REMOTE_PATH;
    private static String SFTP_LOCAL_PATH;

    /* 初始化:加载配置 */
    public static void init()  {
        Properties properties=new Properties();
        InputStream resourceAsStream = Object.class.getResourceAsStream("/importDB.properties");
        if(resourceAsStream!=null){
            try {
                properties.load(resourceAsStream);
                SFTP_HOST=properties.getProperty("SFTP_HOST");
                SFTP_PORT=Integer.parseInt(properties.getProperty("SFTP_PORT"));
                SFTP_USERNAME=properties.getProperty("SFTP_USERNAME");
                SFTP_PASSWORD=properties.getProperty("SFTP_PASSWORD");
                SFTP_REMOTE_PATH=properties.getProperty("SFTP_REMOTE_PATH");
                SFTP_LOCAL_PATH=properties.getProperty("SFTP_LOCAL_PATH");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /*初始值校验*/
    private static boolean valid(){
        if(SFTP_HOST==null || SFTP_HOST.trim().length()==0) return false;
        if(SFTP_PORT==null || SFTP_PORT==0) return false;
        if(SFTP_USERNAME==null || SFTP_USERNAME.trim().length()==0) return false;
        if(SFTP_PASSWORD==null || SFTP_PASSWORD.trim().length()==0) return false;
        if(SFTP_REMOTE_PATH==null || SFTP_REMOTE_PATH.trim().length()==0) return false;
        if(SFTP_LOCAL_PATH==null || SFTP_LOCAL_PATH.trim().length()==0) return false;
        return true;
    }

    /*  获取连接渠道 */
    private static  Session session=null;
    private static  Channel channel=null;
    public static ChannelSftp getChannel() throws JSchException {
        /*创建JSch对象*/
        JSch jsch = new JSch();
        /*根据用户名,主机ip,端口获取一个Session对象*/
        session = jsch.getSession(SFTP_USERNAME, SFTP_HOST, SFTP_PORT);
        /*设置密码*/
        session.setPassword(SFTP_PASSWORD);
        /*Session 配置*/
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.setTimeout(60000);
        /* Session 链接建立 */
        session.connect();
        System.out.println("SESSION IS CONNECTED !");
        /* 打开SFTP通道*/
        channel = session.openChannel("sftp");
        channel.connect();
        System.out.println(" SFTP IS CONNECTED !");
        return (ChannelSftp) channel;
    }

    /*  渠道/Session 关闭 */
    public static void closeChannel() throws Exception {
        if (channel != null) {
            channel.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
    }

    public static void main(String[] args) throws Exception {
        /*初始化*/
        init();
        /*校验*/
        if(valid()){
            /*连接信息*/
            ChannelSftp chSftp = getChannel();
            /*传入目标文件*/
            SftpATTRS attr = chSftp.stat(SFTP_REMOTE_PATH);
            /*文件大小*/
            long fileSize = attr.getSize();
            try {
            /*下载*/
            /*参数: 目标文件,本地文件, ? */
                chSftp.get(SFTP_REMOTE_PATH, SFTP_LOCAL_PATH, new FileProgressMonitor(fileSize));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
            /*关闭*/
                chSftp.quit();
                closeChannel();
            }
        }
    }

}

进度监控


import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;

import com.jcraft.jsch.SftpProgressMonitor;

public class FileProgressMonitor extends TimerTask implements SftpProgressMonitor {
    private long progressInterval = 5 * 1000; // 默认间隔时间为5秒
    private boolean isEnd = false; // 记录传输是否结束
    private long transfered; // 记录已传输的数据总大小
    private long fileSize; // 记录文件总大小
    private Timer timer; // 定时器对象
    private boolean isScheduled = false; // 记录是否已启动timer记时器
    public FileProgressMonitor(long fileSize) {
        this.fileSize = fileSize;
    }

    @Override
    public void run() {
        if (!isEnd()) { // 判断传输是否已结束
            long transfered = getTransfered();
            if (transfered != fileSize) { // 判断当前已传输数据大小是否等于文件总大小
                System.out.println(" 传输 " + transfered + " bytes");
                /*输出日志信息*/
                if (fileSize != 0) {
                    double d = ((double)transfered * 100)/(double)fileSize;
                    DecimalFormat df = new DecimalFormat( "#.##");
                    System.out.println(" 进度 " + df.format(d) + "%");
                } else {
                    System.out.println("已完成");
                }
            } else {
                setEnd(true); // 如果当前已传输数据大小等于文件总大小,说明已完成,设置end
            }
        } else {
            if (timer != null) {
                timer.cancel();
                timer.purge();
                timer = null;
                isScheduled = false;
            }
            return;
        }
    }

    public void start() {
        if (timer == null) {
            timer = new Timer();
        }
        timer.schedule(this, 1000, progressInterval);
        isScheduled = true;
    }
    /** 实现了SftpProgressMonitor接口的count方法  */
    public boolean count(long count) {
        if (isEnd()) return false;
        if (!isScheduled) {
            start();
        }
        add(count);
        return true;
    }
    /**  实现了SftpProgressMonitor接口的end方法 */
    public void end() {
        setEnd(true);
    }

    private synchronized void add(long count) {
        transfered = transfered + count;
    }

    private synchronized long getTransfered() {
        return transfered;
    }

    public synchronized void setTransfered(long transfered) {
        this.transfered = transfered;
    }

    private synchronized void setEnd(boolean isEnd) {
        this.isEnd = isEnd;
    }

    private synchronized boolean isEnd() {
        return isEnd;
    }

    public void init(int op, String src, String dest, long max) {}
}

猜你喜欢

转载自blog.csdn.net/xiewendong93/article/details/53841682
今日推荐