上一篇講述了使用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(文件上傳詳解篇)