2011-11-02 153 views
11

我是JSch和java的新手。我設法得到一些代碼,並以某種方式理解它,但我堅持一點。以下代碼從SSH服務器下載文件,但我需要顯示覆制文件百分比的進度表。我該怎麼做。我將非常感謝您的幫助。JSch 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(); 
    } 
} 

回答

17

com.jcraft.jsch.ChannelSftp中有一些方法用於傳遞迴調。看看

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

方法和com.jcraft.jsch.SftpProgressMonitor接口。在這個Example Code的底部(這有點麻煩),你會發現一個SftpProgressMonitor的實現,它使用它的回調方法count(long)end()來操縱javax.swing.ProgressMonitor

count(long)當有一些字節被傳輸時被週期性地調用,並且end()在傳輸結束時被調用。所以,一個非常簡單的SftpProgressMonitor的imeplementation可能是:

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()); 
+2

感謝名單FO答案.. 如果我下載的文件當時是100MB,我的字節值是:32755 like ,,。那麼你會解釋爲什麼我得到這個值。 – NovusMobile

+0

你可以通過累積給定值來獲得總傳輸數據的大小。 – ymnk

+0

該鏈接似乎沒有工作更多 – Hiran