工作中,有些环境带宽有限,比如说专线,通常带宽比较小,又不便宜,当业务量大的时间,如果在专线上还要传输文件的话,往往在文件传输的时间会导致带宽占慢,就有可能导致时实交易进不来,有可能影响交易,今天贴一下 jsch实现sftp文件上传,并且控制上传的速度,同时监控上传进度,供大家参考。

maven 工程下先把jsch 依赖添加到pom.xml

 <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.54</version></dependency>

java 代码如下:

FileUploadMain.java

package com.sftp;import com.jcraft.jsch.*;import java.io.*;
import java.util.Properties;/*** 使用 JSch 上传文件,并且控制上传的速度,同时监控上传进度*/
public class FileUploadMain {public static void main(String[] args) {JSch jsch = new JSch();UploadMonitor monitor = null;try {Session session = jsch.getSession("ftpuser", "118.24.157.71", 22);session.setPassword("Pass!112%");Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();Channel channel = session.openChannel("sftp");channel.connect();ChannelSftp c = (ChannelSftp) channel;String pwd = c.pwd();System.out.println(pwd);String src = "D:\\software\\apache-tomcat-6.0.36.zip";String dst = c.pwd() + "/apache-tomcat-6.0.36.zip";monitor = new UploadMonitor(new File(src).length());//是否限制上传速度boolean speedLimit = false;if (speedLimit) {OutputStream os = c.put(dst, monitor, ChannelSftp.OVERWRITE);byte[] buff = new byte[1024 * 10]; // 设定每次传输的数据块大小为256KBint read;if (os != null) {FileInputStream fis = new FileInputStream(src);do {read = fis.read(buff, 0, buff.length);if (read > 0) {os.write(buff, 0, read);}os.flush();} while (read >= 0);}} else {c.put(src, dst, monitor, ChannelSftp.OVERWRITE);}c.disconnect();session.disconnect();} catch (Exception e) {/*** 发生异常后,终止监听*/monitor.stop();}}}
UploadMonitor.java
package com.sftp;import com.jcraft.jsch.SftpProgressMonitor;import java.text.NumberFormat;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/**
 * @author kevin.chen
 */
    public class UploadMonitor implements SftpProgressMonitor, Runnable {/**
     * 文件的总大小
     */
    private long maxCount = 0;private long uploaded = 0;long startTime = 0L;private boolean isScheduled = false;ScheduledExecutorService executorService;public UploadMonitor(long maxCount) {this.maxCount = maxCount;}/**
     * 当文件开始传输时,调用init方法
     *
     * @param op
     * @param src
     * @param dest
     * @param max
     */
    @Override
    public void init(int op, String src, String dest, long max) {System.out.println("开始上传文件:" + src + "至远程:" + dest + "文件总大小:" + maxCount / 1024 + "KB");startTime = System.currentTimeMillis();}/**
     * 当每次传输了一个数据块后,调用count方法,count方法的参数为这一次传输的数据块大小
     *
     * @param count
     * @return
     */
    @Override
    public boolean count(long count) {if (!isScheduled) {createTread();}uploaded += count;System.out.println("本次上传大小:" + count / 1024 + "KB,");if (count > 0) {return true;}return false;}/**
     * 当传输结束时,调用end方法
     */
    @Override
    public void end() {}/**
     * 创建一个线程每隔一定时间,输出一下上传进度
     */
    public void createTread() {executorService = Executors.newSingleThreadScheduledExecutor();//1秒钟后开始执行,每2杪钟执行一次
        executorService.scheduleWithFixedDelay(this, 1, 2, TimeUnit.SECONDS);isScheduled = true;}@Override
    public void run() {NumberFormat format = NumberFormat.getPercentInstance();format.setMaximumFractionDigits(2);format.setMinimumFractionDigits(2);String value = format.format((uploaded / (double) maxCount));System.out.println("已传输:" + uploaded / 1024 + "KB,传输进度:" + value);if (uploaded == maxCount) {stop();long endTime = System.currentTimeMillis();System.out.println("传输完成!用时:" + (endTime - startTime) / 1000 + "s");}}public void stop() {boolean isShutdown = executorService.isShutdown();if (!isShutdown) {executorService.shutdown();}}
}

在UploadMonitor类中,方法 public boolean count(long count) 因为每发送一次数据都会执行一次,比较频繁,所以我们单独创建一个线程定时查询一下上传进度

欢迎,收藏转载! 生产使用中需要再微调,比如日志打印

java jsch实现sftp文件上传,并且控制上传的速度,同时监控上传进度相关推荐

  1. jsch 移动服务器上文件,使用JSch实现SFTP文件传输

    1.JSch开发包下载 目前最新版本为: jsch - 0.1.51 2.简单例子,列出指定目录下的文件列表 import  java.util.Properties; import  java.ut ...

  2. SFTP例子2----使用JSch实现SFTP文件传输

    1.JSch开发包下载 http://www.jcraft.com/jsch/ 目前最新版本为:jsch-0.1.51 2.简单例子,列出指定目录下的文件列表 import java.util.Pro ...

  3. sftp api java_SFTP例子2----使用JSch实现SFTP文件传输

    1.JSch开发包下载 目前最新版本为:jsch-0.1.51 2.简单例子,列出指定目录下的文件列表import java.util.Properties; import java.util.Vec ...

  4. sftp api java_使用JSch实现SFTP文件传输

    1.JSch开发包下载 目前最新版本为: jsch - 0.1.51 2.简单例子,列出指定目录下的文件列表 import  java.util.Properties; import  java.ut ...

  5. channelsftp的put_JSch - Java实现的SFTP(文件上传详解篇)

    public void put(String src, String dst) 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同. 采用 ...

  6. SFTP文件上传与下载

    一.引入jar包 <dependency><groupId>com.github.mwiede</groupId><artifactId>jsch< ...

  7. SFTP文件上传、下载

    SFTP文件上传.下载 public class SftpUtil {private String downFilePath = ""; // FTP文件下载路径private S ...

  8. Java从本地扫描文件上传服务器

    项目说明: 本代码只是一个简单的工具类,自己做的整合,采用sftp方式进行上传文件,如有错误,望指正!!! 功能: 1.读取本地指定文件夹的文件,进行扫描读取 2.将读取的文件上传至指定服务器的指定文 ...

  9. FastDFS:Java客户都实现文件的上传、下载、修改、删除

    FastDFS:Java客户都实现文件的上传.下载.修改.删除 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

最新文章

  1. Oracle10g安装中遇到的错误及解决办法
  2. RF中alert的处理
  3. TCHAR char wchar_t PTSTR PCSTR printf() wprintf()——_tprintf()解析
  4. 阻塞队列的应用 || 多线程的条件判断 一定要用while,而不要用 if
  5. HTML(六)------ CSS
  6. angular4更改表单中显示的值_angular4 Form表单相关
  7. 解决 pycharm can not save setting
  8. LeetCode 394: DecodeString (Java)
  9. vue 中使用echart5.2发生TypeError: Cannot read properties of undefined (reading ‘init‘)
  10. 我是如何在GitHub上开源一个项目的(截图说明) (VS2010可以安装git插件)
  11. android 简书代码截图工具,Android 截屏
  12. Excel 2010 VBA 入门 043 按自定义序列进行排序
  13. 万网域名修改 DNS 方法
  14. 未来三年的移动互联网创业----创新工场创始合伙人汪华 在移动开发者大会上的演讲
  15. JavaScript学习 第一周
  16. 回忆做嵌入式软件的几年
  17. jsp连接mysql购物车mvc_mvc购物车项目
  18. EXFO MAX-710B光时域反射仪OTDR主要功能
  19. 【项目管理】管理项目的可交付成果
  20. Oracle日记账如何设置审核,手工日记账操作规范及常见问题分析

热门文章

  1. PIL库使用实例:图片像素风处理
  2. 压缩BCD码拆成两个ACSII码存入指定单元【汇编语言】
  3. python opencv光流跟踪,opencv-python 光流
  4. LoRA学习: SX1276/SX1277/SX1278对比
  5. 3D相册加背景图和背景音乐
  6. linux内核之slob、slab、slub
  7. 2022年六安市实验室、六安市技术创新中心申报条件、流程、材料指南
  8. 二分查找和二分答案(洛谷)
  9. Payment:微信支付发起支付请求文档
  10. 周期信号傅里叶级数公式