2011-11-02 41 views
11

Tôi mới sử dụng JSch và java. Tôi quản lý để có được một số mã và hiểu nó bằng cách nào đó, nhưng tôi bị mắc kẹt trên một điểm. Mã sau đây tải tập tin từ máy chủ SSH, nhưng tôi đang cần đồng hồ đo tiến độ cho thấy tỷ lệ phần trăm của tập tin sao chép. Tôi làm nó như thế nào. Tôi sẽ đánh giá cao sự giúp đỡ của bạn.Quá trình tải lên/tải xuống 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(); 
    } 
} 

Trả lời

17

Có các phương pháp trong số com.jcraft.jsch.ChannelSftp mà bạn sử dụng để chuyển qua gọi lại. Nhìn vào các phương thức

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

và giao diện com.jcraft.jsch.SftpProgressMonitor. Ở dưới cùng của Example Code (đó là loại lộn xộn), bạn sẽ tìm thấy một thực hiện của SftpProgressMonitor sử dụng phương pháp gọi lại của nó count(long)end() để thao tác một javax.swing.ProgressMonitor.

count(long) được gọi định kỳ khi có một số byte đã được chuyển và end() được gọi khi quá trình chuyển đã kết thúc. Vì vậy, một imeplementation thực sự đơn giản của SftpProgressMonitor có thể là:

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

Sau đó tôi muốn tạo ra một thể hiện của điều đó và vượt qua nó để get()

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

thanx fo câu trả lời .. Nếu tôi tải tập tin của 100MB tại thời điểm đó giá trị byte của tôi là: 32755 như ,, vì vậy bạn sẽ giải thích cho tôi tại sao tôi nhận được giá trị này .. – NovusMobile

+0

Bạn có thể nhận được kích thước của tổng số dữ liệu được chuyển bằng cách tích lũy giá trị đã cho. – ymnk

+0

Liên kết này dường như không hoạt động nữa – Hiran

Các vấn đề liên quan