JSch sftp上传/下载进度

问题描述 投票:0回答:1

我是 JSch 和 java 的新手。我设法获得了一些代码并以某种方式理解了它,但我被困在一点上。以下代码从 SSH 服务器下载文件,但我需要显示复制文件百分比的进度表。我该怎么做。我将非常感谢您的帮助。

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpProgressMonitor; 
public class SFTPExample {
    public static void main(String args[]) throws Exception {
        String user = "root";
        String password = "password";
        String host = "192.168.0.5";
        int port = 22;
        String knownHostsFilename = "/home/world/.ssh/known_hosts";        
        String sourcePath = "/media/nfs/genotype.txt";
        String destPath = "genotype.txt";        
        JSch jsch = new JSch();
        jsch.setKnownHosts(knownHostsFilename);
        Session session = jsch.getSession(user, host, port);
        session.setPassword(password);
        session.connect(); 
        ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
        sftpChannel.connect();

        System.out.println("Downloading test file");
        sftpChannel.get(sourcePath, destPath);            

        sftpChannel.exit();
        session.disconnect();
    }
}
java ssh jsch
1个回答
22
投票

用于传递回调的

get
 中存在 
com.jcraft.jsch.ChannelSftp
方法的重载。看看

void get(java.lang.String src, java.lang.String dst, SftpProgressMonitor monitor) 

方法和

com.jcraft.jsch.SftpProgressMonitor
接口。在这个示例代码的底部(有点混乱),您会发现
SftpProgressMonitor
的实现,它使用其回调方法
count(long)
end()
来操作
javax.swing.ProgressMonitor

当传输了一些字节时,

count(long)
会定期被调用,而当传输结束时,
end()
会被调用。所以
SftpProgressMonitor
的一个非常简单的实现可能是:

public class SystemOutProgressMonitor implements SftpProgressMonitor
{
    public SystemOutProgressMonitor() {;}

    public void init(int op, java.lang.String src, java.lang.String dest, long max) 
    {
        System.out.println("STARTING: " + op + " " + src + " -> " + dest + " total: " + max);
    }

    public boolean count(long bytes)
    {
        for(int x=0; x < bytes; x++) {
            System.out.print("#");
        }
        return(true);
    }

    public void end()
    {
        System.out.println("\nFINISHED!");
    }
}

然后我创建一个实例并将其传递给

get()

sftpChannel.get(sourcePath, destPath, new SystemOutProgressMonitor());
© www.soinside.com 2019 - 2024. All rights reserved.