【轉】JSch - Java實現的SFTP(檔案下載詳解篇)

來源:互聯網
上載者:User

標籤:system   util   測試   應用程式   home   get   htm   java   size   

上一篇講述了使用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)
  應用執行個體:SFTPGetTest.java
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位元組:

logs
Transferring begin.Start to read input streamCurrently transferred total size: 2048 bytesCurrently transferred total size: 4096 bytesCurrently transferred total size: 6144 bytesCurrently transferred total size: 8192 bytesCurrently transferred total size: 10240 bytesCurrently transferred total size: 12288 bytesCurrently transferred total size: 14336 bytes...

 

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

 

文章出處:http://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html

【轉】JSch - Java實現的SFTP(檔案下載詳解篇)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.