標籤: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(檔案下載詳解篇)