使用commons-net包操作FTP和使用jsch包来操作SFTP时如何显示传输进度

效果图如下:

tranfer.gif

使用commons-net包操作FTP

主要代码

ftpClient.setCopyStreamListener(new FTPProcess(fileSize,startTime)); //这句很关键
ftpClient.storeFile(filename, fileInputStream);

这里用来上传

fileSize 文件的大小
startTime是开始的时间,通过 System.currentTimeMillis() 获取

然后是FTPProcess类

package com.linux178.utils;


import org.apache.commons.net.io.CopyStreamEvent;
import org.apache.commons.net.io.CopyStreamListener;


/**
 * FTP传输进度显示
 */
public class FTPProcess implements CopyStreamListener {

    private long fileSize;
    private long startTime;

    public FTPProcess(long fileSize,long startTime) {
        this.fileSize = fileSize;
        this.startTime = startTime;
    }

    @Override
    public void bytesTransferred(CopyStreamEvent copyStreamEvent) {

    }

    /**
     * 本次传输了多少字节
     * @param totalBytesTransferred 到目前为止已经传输了多少字节
     * @param bytesTransferred 本次传输的字节数
     * @param streamSize The number of bytes in the stream being copied
     */
    @Override
    public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
        long end_time = System.currentTimeMillis();
        long time = (end_time - startTime) / 1000; // 耗时多长时间
        long speed; //速度
        if (0 == time){
            speed = 0;
        } else {
            speed = totalBytesTransferred/1024/time;
        }
        System.out.printf("\r    %d%%   %d  %dKB/s  %d   %ds",
                totalBytesTransferred * 100 /fileSize,totalBytesTransferred,speed,fileSize,time);
    }
}

每次传输 bytesTransferred 字节时,就会调用 new FTPProcess(fileSize,startTime) 这个对象的 bytesTransferred 方法

另外,如果FTP传输速度特别慢,请设置一下该参数,就会大大提高传输速度

ftpClient.setBufferSize(100000);

默认是1024

使用jsch包来操作SFTP时如何显示传输进度

主要代码

channelSftp.put("/path/to/local/filename", "/path/to/remote/filename", new SFTPProcess(fileSize, startTime));

这里用来上传

fileSize 文件的大小
startTime是开始的时间,通过 System.currentTimeMillis() 获取

然后是SFTPProcess类

package com.linux178.utils;


import com.jcraft.jsch.SftpProgressMonitor;


/**
 * SFTP传输进度显示
 */
public class SFTPProcess implements SftpProgressMonitor {

    private long fileSize;
    private long startTime;
    private long totalBytesTransferred = 0;

    public SFTPProcess(long fileSize, long startTime) {
        this.fileSize = fileSize;
        this.startTime = startTime;
    }

    @Override
    public void init(int i, String s, String s1, long l) {
    }

    /**
     * 本次传输了多少字节
     * @param count 本次传输了多少字节
     * @return true 继续传输,false 取消传输
     */
    @Override
    public boolean count(long count) {
        totalBytesTransferred += count;
        long end_time = System.currentTimeMillis();
        long time = (end_time - startTime) / 1000; // 耗时多长时间
        long speed; // 传输速度
        if (0 == time){
            speed = 0;
        } else {
            speed = totalBytesTransferred /1024/time;
        }
        System.out.printf("\r    %d%%   %d  %dKB/s  %d   %ds",
                totalBytesTransferred * 100 /fileSize, totalBytesTransferred,speed,fileSize,time);
        return true;
    }

    @Override
    public void end() {
    }
}

每次传输count字节时,就会调用 new SFTPProcess(fileSize, startTime) 这个对象的count方法

标签:jsch, ftp进度, common-net 进度, jsch进度, jsch sftp 进度, sftp进度, 进度, common-net, ftp传输速度慢, common-net ftp 传输速度慢

已有 4 条评论

  1. 于跃 于跃

    老牛逼了

  2. 动图不错,看上去很牛。

  3. 皮哥阳 皮哥阳

    非常不错呀

添加新评论