You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JSch 0.1.51下载近2GB文件时抛出inputstream closed异常求助

解决JSch 0.1.51下载大文件时的inputstream is closed异常

问题场景

从远程SFTP站点下载接近2GB的文件时,文件实际已完成下载,但在最终收尾阶段触发以下异常:

4: 
    at com.jcraft.jsch.ChannelSftp._get(ChannelSftp.java:1160)
    at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:1006)
    at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:984)
    at SFTPTest.main(SFTPTest.java:23)
Caused by: java.io.IOException: inputstream is closed
    at com.jcraft.jsch.ChannelSftp.fill(ChannelSftp.java:2884)
    at com.jcraft.jsch.ChannelSftp.header(ChannelSftp.java:2908)
    at com.jcraft.jsch.ChannelSftp.checkStatus(ChannelSftp.java:2446)
    at com.jcraft.jsch.ChannelSftp._sendCLOSE(ChannelSftp.java:2465)
    at com.jcraft.jsch.ChannelSftp._get(ChannelSftp.java:1155)
    ... 3 more

使用的JSch版本为0.1.51。

可行解决方案

  • 优先升级JSch版本:0.1.51是2014年的老旧版本,存在大文件传输收尾阶段的流处理bug。升级到0.1.55及以上的稳定版,可直接修复该异常。
  • 无法升级时手动处理流:放弃使用ChannelSftp.get()封装方法,手动实现流的读写逻辑,规避JSch内部的流关闭逻辑问题。示例代码:
ChannelSftp sftpChannel = (ChannelSftp) channel;
InputStream remoteIn = sftpChannel.get("/remote/path/large-file.bin");
OutputStream localOut = new FileOutputStream(new File("local-large-file.bin"));

byte[] buffer = new byte[1024 * 1024]; // 1MB缓冲区提升传输效率
int readLen;
while ((readLen = remoteIn.read(buffer)) != -1) {
    localOut.write(buffer, 0, readLen);
}

// 按顺序关闭资源
localOut.close();
remoteIn.close();
sftpChannel.quit();
  • 添加文件完整性校验:下载完成后,对比本地文件与远程文件的大小或哈希值,确保文件未损坏。

内容的提问来源于stack exchange,提问作者KVNS_JavaLearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:40:04