JSch - Java實現的SFTP(文件下載詳解篇)


上一篇講述了使用JSch實現文件上傳的功能,這一篇主要講述一下JSch實現文件下載的功能。並介紹一些SFTP的輔助方法,如cd,ls等。

同樣,JSch的文件下載也支持三種傳輸模式:OVERWRITE, RESUME和APPEND,請參考上篇隨筆: JSch - Java實現的SFTP(文件上傳詳解篇)

文件下載

JSch文件下載是通過調用ChannelSftp對象的get方法來實現的。ChannelSftp中有9個get方法的重載方法:

publicvoid get(String src, String dst)
將目標服務器上文件名為src的文件下載到本地,本地文件名為dst。若dst為目錄,則下載到本地的文件名將與src文件名相同。(注:src必須是文件,不能為目錄)
采用默認的傳輸模式:OVERWRITE
publicvoid get(String src, String dst,  SftpProgressMonitor monitor)
將目標服務器上文件名為src的文件下載到本地,本地文件名為dst。若dst為目錄,則下載到本地的文件名將與src文件名相同。(注:src必須是文件,不能為目錄)
采用默認的傳輸模式:OVERWRITE
並使用實現了SftpProgressMonitor接口的monitor對象來監控文件的傳輸進度。
publicvoid get(String src, String dst, SftpProgressMonitor monitor, int mode)
將目標服務器上文件名為src的文件下載到本地,本地文件名為dst。若dst為目錄,則下載到本地的文件名將與src文件名相同。(注:src必須是文件,不能為目錄)
指定文件傳輸模式為mode(mode可選值為:ChannelSftp.OVERWRITE,ChannelSftp.RESUME,ChannelSftp.APPEND)
並使用實現了SftpProgressMonitor接口的monitor對象來監控文件的傳輸進度。
publicvoid get(String src, OutputStream dst)
將目標服務器上文件名為src的文件下載到本地,下載的數據寫入到輸出流對象dst(如:文件輸出流)。
采用默認的傳輸模式:OVERWRITE
publicvoid get(String src, OutputStream dst,  SftpProgressMonitor monitor)
將目標服務器上文件名為src的文件下載到本地,下載的數據寫入到輸出流對象dst(如:文件輸出流)。
采用默認的傳輸模式:OVERWRITE
並使用實現了SftpProgressMonitor接口的monitor對象來監控文件的傳輸進度。
publicvoid get(String src, OutputStream dst,  SftpProgressMonitor monitor, int mode, long skip)
將目標服務器上文件名為src的文件下載到本地,下載的數據寫入到輸出流對象dst(如:文件輸出流)。
指定文件傳輸模式為mode
並使用實現了SftpProgressMonitor接口的monitor對象來監控文件的傳輸進度。
skip指定了一個跳讀量,即下載時從src文件跳過skip字節的數據。(一般不推薦使用該參數,默認設為0)
public InputStream get(String src)
該方法返回一個輸入流,該輸入流含有目標服務器上文件名為src的文件數據。可以從該輸入流中讀取數據,最終將數據傳輸到本地(如:讀取數據后將數據寫入到本地的文件中)
(注:該方法不支持多種文件傳輸模式,如何讀取與保存數據由應用程序自己確定)
public InputStream get(String src, SftpProgressMonitor monitor)
該方法返回一個輸入流,該輸入流含有目標服務器上文件名為src的文件數據。可以從該輸入流中讀取數據,最終將數據傳輸到本地(如:讀取數據后將數據寫入到本地的文件中)
並使用實現了SftpProgressMonitor接口的monitor對象來監控文件的傳輸進度。
(注:該方法不支持多種文件傳輸模式,如何讀取與保存數據由應用程序自己確定)
public InputStream get(String src, final SftpProgressMonitor monitor, finallong skip)
該方法返回一個輸入流,該輸入流含有目標服務器上文件名為src的文件數據。可以從該輸入流中讀取數據,最終將數據傳輸到本地(如:讀取數據后將數據寫入到本地的文件中)
並使用實現了SftpProgressMonitor接口的monitor對象來監控文件的傳輸進度。
(注:該方法不支持多種文件傳輸模式,如何讀取與保存數據由應用程序自己確定)
skip指定了一個跳讀量,即下載時從src文件跳過skip字節的數據。(一般不推薦使用該參數,默認設為0)

應用實例:

package com.longyg.sftp;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.SftpATTRS;

public class SFTPGetTest {

    public SFTPChannel getSFTPChannel() {
        return new SFTPChannel();
    }

    public static void main(String[] args) throws Exception {
        SFTPGetTest test = new SFTPGetTest();

        Map<String, String> sftpDetails = new HashMap<String, String>();
        // 設置主機ip,端口,用戶名,密碼
        sftpDetails.put(SFTPConstants.SFTP_REQ_HOST, "10.9.167.55");
        sftpDetails.put(SFTPConstants.SFTP_REQ_USERNAME, "root");
        sftpDetails.put(SFTPConstants.SFTP_REQ_PASSWORD, "arthur");
        sftpDetails.put(SFTPConstants.SFTP_REQ_PORT, "22");
        
        SFTPChannel channel = test.getSFTPChannel();
        ChannelSftp chSftp = channel.getChannel(sftpDetails, 60000);
        
        String filename = "/home/omc/ylong/sftp/INTPahcfg.tar.gz";
        SftpATTRS attr = chSftp.stat(filename);
        long fileSize = attr.getSize();
        
        String dst = "D:\\INTPahcfg.tar.gz";
        OutputStream out = new FileOutputStream(dst);
        try {
            
            chSftp.get(filename, dst, new FileProgressMonitor(fileSize)); // 代碼段1
            
            // chSftp.get(filename, out, new FileProgressMonitor(fileSize)); // 代碼段2
            
            /**
             * 代碼段3
             * 
            InputStream is = chSftp.get(filename, new MyProgressMonitor());
            byte[] buff = new byte[1024 * 2];
            int read;
            if (is != null) {
                System.out.println("Start to read input stream");
                do {
                    read = is.read(buff, 0, buff.length);
                    if (read > 0) {
                        out.write(buff, 0, read);
                    }
                    out.flush();
                } while (read >= 0);
                System.out.println("input stream read done.");
            }
            */
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            chSftp.quit();
            channel.closeChannel();
        }
    }
}
:請分別將main方法中的代碼段1,代碼段2,代碼段3取消注釋,運行程序來進行測試。這三段代碼分別演示了如何使用JSch的各種put方法來進行文件下載。

程序段:

SFTPChannel channel = test.getSFTPChannel();
ChannelSftp chSftp = channel.getChannel(sftpDetails, 60000);

這兩行語句得到一個ChannelSftp對象,具體實現見上篇隨筆:JSch - Java實現的SFTP(文件上傳詳解篇)

注意:每個get方法中都使用了一個SftpProgressMonitor接口的實現對象(FileProgressMonitor和MyProgressMonitor)來監控傳輸進度,具體實現見上篇隨筆:JSch - Java實現的SFTP(文件上傳詳解篇)

代碼段1:直接將目標服務器上文件名為src的文件下載到本地,本地文件名為dst。(注:使用這個方法時,dst可以是目錄,若dst為目錄,則下載到本地的文件名將與src文件名相同)

代碼段2:將目標服務器上文件名為src的文件下載到本地的一個輸出流對象,該輸出流為一個文件輸出流

代碼段3:采用讀取get方法返回的輸入流數據的方式來下載文件。這個示例中,將讀取的數據寫入到了本地的一個文件中。采用這種方式,可以由應用程序設定每次讀取輸入流的數據塊大小,也就是每次傳輸的數據塊大小。比如這個示例中:

byte[] buff = new byte[1024 * 2];

這條語句指定了每次傳輸的數據塊大小為2KB,可以從測試代碼段3的輸出中看出確實每次只傳輸了2KB,即2048字節:

Transferring begin.
Start to read input stream
Currently transferred total size: 2048 bytes
Currently transferred total size: 4096 bytes
Currently transferred total size: 6144 bytes
Currently transferred total size: 8192 bytes
Currently transferred total size: 10240 bytes
Currently transferred total size: 12288 bytes
Currently transferred total size: 14336 bytes
...

JSch文件下載與文件上傳的傳輸進度,都是通過實現SftpProgressMonitor接口來實現的。所以這里不在詳述,請直接參見上篇隨筆:JSch - Java實現的SFTP(文件上傳詳解篇)

本文轉自:http://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM