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

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(文件上传详解篇)

声明:本文为个人原创文章,如转载请注明文章出处: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的文件下载也支持三种传输模式:OVERWRITE ...

  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. (转)一个form表单实现提交多个action

    方法一: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4 ...

  2. java 函数形参传值和传引用的区别

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  3. JavaScript实现多栏目切换效果

    效果: 代码: <!doctype html> <html> <head> <meta http-equiv="Content-Type" ...

  4. [FTP] FTPOperater--FTP操作帮助类 (转载)

    点击下载 FTPOperater.zip 这个类是关于FTP的一些操作的1.连接FTP服务器 2.上传3.下载4.删除文件5.获取当前目录下明细(包含文件和文件夹)  6.获取FTP文件列表(包括文件 ...

  5. asp IIS部署An error occurred on the server when processing the URL错误提示解决

    An error occurred on the server when processing the URL. Please contact the system administrator.If ...

  6. SQL分页语句总结

    今天对分页语句做一个简单的总结,他们大同小异的,只要理解其中一个其他的就很好理解了. 使用top选项 selecttop10*from Orders a where a.orderid notin(s ...

  7. swift 关于闭包和函数

    调用函数,有闭包参数时: 函数的实现中:闭包为参数时,有参数返回值类型: 调用闭包时,传入参数 调用函数时:闭包为参数,是闭包的实现,当闭包为最后一个参数时,可写在参数括号外面 即===>函数在 ...

  8. IOC容器 - Autofac概述

    Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...

  9. python模块学习 hashlib

    一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法借口,如SHA1.SHA224.SHA2 ...

  10. 将[{},{}]转为dict

    经常遇到一种需求,需要把从数据库取出的数据,转为dict对象([{}, {},...]-->dict). rs = [{, , "name":"edf"} ...