JSch sftp прогресс загрузки / скачивания - PullRequest
13 голосов
/ 02 ноября 2011

Я новичок в 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();
    }
}

1 Ответ

20 голосов
/ 02 ноября 2011

В 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...