java - 断开连接后使用 SFTP 下载 InputStream 时 JSch "pipe closed"

标签 java sftp inputstream jsch

我正在使用 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);    
}

问题是:

  1. 如果我使用exit() 和/或disconnect() 方法,将会抛出Pipe closed 异常
  2. 如果不这样做,我的方法会成功返回一个 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/

相关文章:

java - 解析 XML 文件时如何测试内存限制

Java - 从 SFTP 直接下载到内存,无需写入文件

php - 无法通过 phpseclib 打开 SFTP 连接

java - 是否可以从具有超时的输入流中读取?

Python StreamIO 从同一个流读取和写入

java - Eclipse Java Enum 缩进超过左括号。如何让它看起来更正常?

java - 想要从特定日期获取一个月的开始和结束日期

java - Eclipse 中 Java 8 换行 RegEx 转义字符的问题

ssh - goftp 软件包是否提供安全文件传输?

java - 使用 Java 类将文件上传到服务器