zoukankan      html  css  js  c++  java
  • 【转】JSch

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

    将目标服务器上文件名为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 import com.jcraft.jsch.ChannelSftp;
     8 import com.jcraft.jsch.SftpATTRS;
     9 
    10 public class SFTPGetTest {
    11     public SFTPChannel getSFTPChannel() {
    12         return new SFTPChannel();
    13     }
    14     public static void main(String[] args) throws Exception {
    15         SFTPGetTest test = new SFTPGetTest();
    16         Map<String, String> sftpDetails = new HashMap<String, String>();
    17         // 设置主机ip,端口,用户名,密码
    18         sftpDetails.put(SFTPConstants.SFTP_REQ_HOST, "10.9.167.55");
    19         sftpDetails.put(SFTPConstants.SFTP_REQ_USERNAME, "root");
    20         sftpDetails.put(SFTPConstants.SFTP_REQ_PASSWORD, "arthur");
    21         sftpDetails.put(SFTPConstants.SFTP_REQ_PORT, "22");
    22         
    23         SFTPChannel channel = test.getSFTPChannel();
    24         ChannelSftp chSftp = channel.getChannel(sftpDetails, 60000);
    25         
    26         String filename = "/home/omc/ylong/sftp/INTPahcfg.tar.gz";
    27         SftpATTRS attr = chSftp.stat(filename);
    28         long fileSize = attr.getSize();
    29         
    30         String dst = "D:\INTPahcfg.tar.gz";
    31         OutputStream out = new FileOutputStream(dst);
    32         try {
    33             
    34             chSftp.get(filename, dst, new FileProgressMonitor(fileSize)); // 代码段1
    35             
    36             // chSftp.get(filename, out, new FileProgressMonitor(fileSize)); // 代码段2
    37             
    38             /**
    39              * 代码段3
    40              *
    41             InputStream is = chSftp.get(filename, new MyProgressMonitor());
    42             byte[] buff = new byte[1024 * 2];
    43             int read;
    44             if (is != null) {
    45                 System.out.println("Start to read input stream");
    46                 do {
    47                     read = is.read(buff, 0, buff.length);
    48                     if (read > 0) {
    49                         out.write(buff, 0, read);
    50                     }
    51                     out.flush();
    52                 } while (read >= 0);
    53                 System.out.println("input stream read done.");
    54             }
    55             */
    56         } catch (Exception e) {
    57             e.printStackTrace();
    58         } finally {
    59             chSftp.quit();
    60             channel.closeChannel();
    61         }
    62     }
    63 }
    SFTPGetTest.java

    注:请分别将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字节:

     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

    博客地址: http://www.cnblogs.com/dwf07223,本文以学习、研究和分享为主,欢迎转载,转载请务必保留此出处。若本博文中有不妥或者错误处请不吝赐教。

  • 相关阅读:
    关于开发 Web AI 的思考(kendryte K210)
    怪不得我说,这几个月的代码数据都跑哪里去了....
    在 Android 上使用蓝牙作为主机进行一对多从机传输数据的实测,理论 5
    写了一下 micropython 的文件系统单元测试
    mark 自己未来要写一下,蓝牙主机一对多从机和 K210 的网络通信优化过程。
    VUE实现Studio管理后台(五):手风琴式折叠组件(Accordion)
    VUE实现Studio管理后台(四):状态模式实现窗口停靠,灵动、自由
    VUE实现Studio管理后台(三):支持多语言国际化(vue-i18n)
    VUE实现Studio管理后台(二):Slot实现选项卡tab切换效果,可自由填装内容
    VUE实现Studio管理后台(一):鼠标拖放改变窗口大小
  • 原文地址:https://www.cnblogs.com/dwf07223/p/4000685.html
Copyright © 2011-2022 走看看