使用commons-net包操作FTP和使用jsch包来操作SFTP时如何显示传输进度
效果图如下:
使用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方法
老牛逼了
动图不错,看上去很牛。
非常不错呀
谢谢。