2011-11-02 18 views
11

Sono nuovo di JSch e java. Sono riuscito a ottenere alcuni codici e capirlo in qualche modo, ma sono bloccato su un punto. Il seguente codice scarica il file dal server SSH, ma ho bisogno del misuratore di avanzamento che mostra la percentuale del file copiato. Come posso farlo. Sarò molto grato del tuo aiuto.JSch sftp upload/download progress

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(); 
    } 
} 

risposta

17

Esistono metodi nello com.jcraft.jsch.ChannelSftp che si utilizzano per passare un callback. Guarda il

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

metodi e interfaccia com.jcraft.jsch.SftpProgressMonitor. In fondo a questo Example Code (è un po 'disordinato), troverai un'implementazione di SftpProgressMonitor che utilizza i suoi metodi di callback count(long) e end() per manipolare uno javax.swing.ProgressMonitor.

count(long) viene chiamato periodicamente quando ci sono alcuni byte che sono stati trasferiti e end() viene chiamato quando il trasferimento è terminato. Quindi davvero un semplice imeplementation di SftpProgressMonitor potrebbe essere:

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!"); 
    } 
} 

mi piacerebbe quindi creare un'istanza di questo e passarlo a get()

sftpChannel.get(sourcePath, destPath, new SystemOutProgressMonitor()); 
+2

thanx fo la risposta .. Se sto lima di scaricare 100 MB in quel momento il mio valore in byte è: 32755 come ,,. Così mi spiegheresti perché sto ottenendo questo valore .. – NovusMobile

+0

Puoi ottenere la dimensione dei dati trasferiti totali accumulando quel dato valore. – ymnk

+0

Il link sembra non funzionare più – Hiran

Problemi correlati