我正在使用 JSch 打开到远程服务器的 SFTP channel 。我使用以下代码打开连接并下载文件:
public org.springframework.core.io.Resource download(){
JSch jsch = new Jsch();
Session session = jsch.get("root", "192.168.1.10", 22);
session.setPassword("root");
session.setConfig("StrictHostKeyChecking","no");
session.connect();
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
InputStream is = channelSftp.get("/root/example.mp4");
channelSftp.exit();
session.disconnect();
return new org.springframework.core.io.InputStreamResource(is);
}
问题是:
- 如果我使用
exit()
和/或disconnect()
方法,将会抛出Pipe closed
异常 - 如果不这样做,我的方法会成功返回一个
Resource
,但 channel / session 仍处于connected
状态。
所以我有一个问题,这个实现是否有问题?如果没有, session 数量是否会增加直到 SFTP 服务器拒绝,或者它们将在未来某个时间关闭,我该如何处理?
先谢谢你
最佳答案
断开连接后您将无法访问数据。
如果 API 需要 InputStream
然后您失去了控制权,您可以实现一个包装器 InputStream
实现,将所有调用委托(delegate)给您的 is
,并在调用 InputStream.close
后调用 disconnect
。
对于不太大的文件,更简单但效率较低的解决方案是将 JSch 流读取到内存(到 byte
数组)并返回数组或包装器 ByteArrayInputStream
到您的 API。
关于java - 断开连接后使用 SFTP 下载 InputStream 时 JSch "pipe closed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62834006/