2011-11-02 40 views
11

JSchとjavaを初めて使用しています。私はいくつかのコードを取得し、それをどうにかして理解することができましたが、私は1つのポイントで立ち往生しています。次のコードは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(厄介なのそれのようなもの)の下部に、あなたはjavax.swing.ProgressMonitorを操作するためのコールバックメソッドcount(long)end()を使用していますSftpProgressMonitorの実装を見つけることができます。

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

私は、そのインスタンスを作成して、私は、ファイルをダウンロードしていた場合の答え.. FO get()

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

ありがとうに渡したいですその時私のバイトの値は:32755のように,,だから私はなぜ私はこの値を取得しているのか説明します。 – NovusMobile

+0

転送された合計データのサイズは、その与えられた値を累積することによって得ることができます。 – ymnk

+0

リンクはもう動作していないようです – Hiran

関連する問題