上一篇讲述了使用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)

应用实例:

  1. package com.longyg.sftp;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.io.OutputStream;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7.  
  8. import com.jcraft.jsch.ChannelSftp;
  9. import com.jcraft.jsch.SftpATTRS;
  10.  
  11. public class SFTPGetTest {
  12.  
  13. public SFTPChannel getSFTPChannel() {
  14. return new SFTPChannel();
  15. }
  16.  
  17. public static void main(String[] args) throws Exception {
  18. SFTPGetTest test = new SFTPGetTest();
  19.  
  20. Map<String, String> sftpDetails = new HashMap<String, String>();
  21. // 设置主机ip,端口,用户名,密码
  22. sftpDetails.put(SFTPConstants.SFTP_REQ_HOST, "10.9.167.55");
  23. sftpDetails.put(SFTPConstants.SFTP_REQ_USERNAME, "root");
  24. sftpDetails.put(SFTPConstants.SFTP_REQ_PASSWORD, "arthur");
  25. sftpDetails.put(SFTPConstants.SFTP_REQ_PORT, "22");
  26.  
  27. SFTPChannel channel = test.getSFTPChannel();
  28. ChannelSftp chSftp = channel.getChannel(sftpDetails, 60000);
  29.  
  30. String filename = "/home/omc/ylong/sftp/INTPahcfg.tar.gz";
  31. SftpATTRS attr = chSftp.stat(filename);
  32. long fileSize = attr.getSize();
  33.  
  34. String dst = "D:\\INTPahcfg.tar.gz";
  35. OutputStream out = new FileOutputStream(dst);
  36. try {
  37.  
  38. chSftp.get(filename, dst, new FileProgressMonitor(fileSize)); // 代码段1
  39.  
  40. // chSftp.get(filename, out, new FileProgressMonitor(fileSize)); // 代码段2
  41.  
  42. /**
  43. * 代码段3
  44. *
  45. InputStream is = chSftp.get(filename, new MyProgressMonitor());
  46. byte[] buff = new byte[1024 * 2];
  47. int read;
  48. if (is != null) {
  49. System.out.println("Start to read input stream");
  50. do {
  51. read = is.read(buff, 0, buff.length);
  52. if (read > 0) {
  53. out.write(buff, 0, read);
  54. }
  55. out.flush();
  56. } while (read >= 0);
  57. System.out.println("input stream read done.");
  58. }
  59. */
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. } finally {
  63. chSftp.quit();
  64. channel.closeChannel();
  65. }
  66. }
  67. }
:请分别将main方法中的代码段1,代码段2,代码段3取消注释,运行程序来进行测试。这三段代码分别演示了如何使用JSch的各种put方法来进行文件下载。

程序段:

  1. SFTPChannel channel = test.getSFTPChannel();
  2. 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方法返回的输入流数据的方式来下载文件。这个示例中,将读取的数据写入到了本地的一个文件中。采用这种方式,可以由应用程序设定每次读取输入流的数据块大小,也就是每次传输的数据块大小。比如这个示例中:

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

这条语句指定了每次传输的数据块大小为2KB,可以从测试代码段3的输出中看出确实每次只传输了2KB,即2048字节:

  1. Transferring begin.
  2. Start to read input stream
  3. Currently transferred total size: 2048 bytes
  4. Currently transferred total size: 4096 bytes
  5. Currently transferred total size: 6144 bytes
  6. Currently transferred total size: 8192 bytes
  7. Currently transferred total size: 10240 bytes
  8. Currently transferred total size: 12288 bytes
  9. Currently transferred total size: 14336 bytes
  10. ...

JSch文件下载与文件上传的传输进度,都是通过实现SftpProgressMonitor接口来实现的。所以这里不在详述,请直接参见上篇随笔:JSch - Java实现的SFTP(文件上传详解篇)

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

JSch - Java实现的SFTP(文件下载详解篇)的更多相关文章

  1. 【转】JSch - Java实现的SFTP(文件下载详解篇)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等.   同样,JSch的文件下载也支持三种传输模式:OVERWRI ...

  2. JSch - Java实现的SFTP(文件下载详解篇)(转)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等.   同样,JSch的文件下载也支持三种传输模式:OVERWRI ...

  3. JSch - Java实现的SFTP

    JSch - Java实现的SFTP(文件上传详解篇)     JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以 ...

  4. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  5. Java开发利器Myeclipse全面详解

    Java开发利器Myeclipse全面详解: Ctrl+1:修改代码错误 Alt+Shift+S:Source命令 Ctrl+7:单行注释 Ctrl+Shift+/ :多行注释 Ctrl+I :缩进( ...

  6. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  7. [译]Java Thread join示例与详解

    Java Thread join示例与详解 Java Thread join方法用来暂停当前线程直到join操作上的线程结束.java中有三个重载的join方法: public final void ...

  8. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  9. 使用Java操作文本文件的方法详解

    使用Java操作文本文件的方法详解 摘要: 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而 ...

随机推荐

  1. RTP timestamp与帧率及时钟频率的关系

    转自:http://blog.csdn.net/jasonhwang/article/details/7316128 RTP timestamp是用时钟频率(clock rate)计算而来表示时间的. ...

  2. java中 this 和super的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...

  3. Eclipse·如何关联Git库文件和添加JUint库

    Eclipse创建工程并关联到文件(SVN或Git管理的代码文件) 新建java工程,用于存放工程的一些信息,默认存放地址. 工程相关的信息是不需要提交到(SVN或Git)版本库的,所以工程存放到本地 ...

  4. 真机测试INSTALL_FAILED_INSUFFICIENT_STORAGE 的解决方法

    来源:http://blog.csdn.net/aikongmeng/article/details/9793809 INSTALL_FAILED_INSUFFICIENT_STORAGE 的解决方法 ...

  5. 如何给你的ASP.NET页面添加HelpPage

    如何给你的ASP.NET页面添加HelpPage 最近写了一些webAPI,所以需要搞一套API的帮助文档,google了一下,发现这是可以自动生成的,以下就是如何自动生成HelpPage的说明. 参 ...

  6. 异步框架asyn4j的原理

    启动时调用init方法 public void init(){ if (!run){ run = true; //工作队列 workQueue = newPriorityBlockingQueue(m ...

  7. EventBus的使用,数据传递

    通常情况下安卓下数据的传递有下面几种方法: 1.通过intent传递,包括显式意图和隐式意图,广播(Broadcast)和服务都能通过Intent传递 传递的数据类型包括8大基本数据类型    实现P ...

  8. js-面向对象的程序设计,函数表达式

    面向对象的程序设计: 1.属性类型:数据属性.访问器属性 数据属性:wirtable:false –只读:如果尝试为它赋值,会忽略 Configurable:false—不能从对象中删除属性 在调用O ...

  9. zoj 3795 Grouping tarjan缩点 + DGA上的最长路

    Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practic ...

  10. delphi override、overload、reintroduce的区别-0613.txt

    http://blog.csdn.net/honglixx/article/details/3624934 1.override overload reintroduce的中文叫法是什么? overr ...