2011-11-02 49 views
11

Soy nuevo en JSch y java. Pude obtener algunos códigos y entenderlos de alguna manera, pero estoy atascado en un punto. El siguiente código descarga archivos del servidor SSH, pero necesito el medidor de progreso que muestra el porcentaje de archivos copiados. Cómo puedo hacerlo. Agradeceré mucho su ayuda.JSch progreso de carga/descarga sftp

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

Respuesta

17

Hay métodos en el com.jcraft.jsch.ChannelSftp que se utilizan para transmitir en una devolución de llamada. Mire

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

métodos y com.jcraft.jsch.SftpProgressMonitor interfaz. En la parte inferior de este Example Code (es un poco desordenado), encontrará una implementación de SftpProgressMonitor que usa sus métodos de devolución de llamada count(long) y end() para manipular un javax.swing.ProgressMonitor.

count(long) se llama periódicamente cuando hay algunos bytes que se han transferido, y se llama a end() cuando la transferencia ha finalizado. Por lo que una muy simple imeplementation de SftpProgressMonitor podría ser:

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

me gustaría a continuación, crear una instancia de esa y pasarlo a get()

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

Gracias fo la respuesta .. Si estoy archivo de descargar 100MB en ese momento mi valor de bytes es: 32755 me gusta ,,. Entonces, ¿me explicaría por qué estoy obteniendo este valor? – NovusMobile

+0

Puede obtener el tamaño del total de datos transferidos al acumular ese valor dado. – ymnk

+0

El enlace ya no parece funcionar – Hiran