java sftp工具类(支持多线程下载) 您所在的位置:网站首页 sftp下载要做成多线程的 java sftp工具类(支持多线程下载)

java sftp工具类(支持多线程下载)

2023-09-26 09:49| 来源: 网络整理| 查看: 265

最近需要从sftp上下载文件。我看到网上大部分都不支持多线程下载很多都会卡死,或者是排队下载。我也从网上copy了一份代码,看了一下。发现了原因。

卡死原因 因为很多都是一个session对应一个channel,但是没有做并发处理,导致有的session未被关闭。会话一直存在,它可以被垃圾回收,但是要等到下次gc时才会关闭该session。 排队下载 这就是对上面进行了并发处理,让其同步创建session,然后session创建channel,并且同步关闭channel和session。这样也就下载完成了。但是他们是同步下载,所以需要排队。 一个session个channel 如果是一个session多个channel,那么当所有channel下载完成关闭时,如果当前session没被关闭,那么所有的数据将停留在内存中,有时候你会发现,你结束掉java进程的时候,它所有数据都被flush到文件了。也就是关闭session。

我拿着改进了一下,将其每个下载对应一个session和一个channel。那么意味着每个session->channel是独立存在的,不存在冲突问题。下面是代码,可以参考下:

import com.jcraft.jsch.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import java.io.*; import java.util.Properties; /** * @author xoxo * @description sftp支持多线程下载 */ @Slf4j @Data public class SftpClient { private static String host = "192.168.10.130"; private static String username = "foo"; private static String password = "pass"; protected static String privateKey;// 密钥文件路径 protected static String passphrase;// 密钥口令 private static int port = 2222; @Data @AllArgsConstructor private static class SftpObject{ private Session session; private ChannelSftp channelSftp; } public static SftpObject connect() { JSch jsch = new JSch(); ChannelSftp sftp = null; Channel channel = null; Session session


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有