使用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
相关产品推荐
相关产品推荐

