背景:实现文件SFTP上传和下载功能,公司一开始实现是直接上传到服务器,生产环境权限不足不能进行新建文件,改进为sftp上传下载,在下载的过程中出现以下报错
sftp下载文件过程中报错:“java.io.IOException: Pipe closed”
原因:关闭SFTP连接的时候InputStream流也随着关闭
改造:我从下载SFTP流里面读取字节返回,再把读取的字节放到流里面上传外部SFTP,这样问题就解决了。
public class StreamOperateUtil {
public static void main(String[] args) throws FileNotFoundException {
// 从sftp上请求下载
InputStream is = sFtpUtils.download(filePath, fileName, sftp);
// 输入流转换为输出流
ByteArrayOutputStream baos = cloneInputStream(is);
// 关闭sftp
sFtpUtils.disConnect(sftp);
// 打开新的输入流
InputStream stream1 = new ByteArrayInputStream(baos.toByteArray());
}
private static ByteArrayOutputStream cloneInputStream(InputStream input) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
return baos;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}