ftp.retrieveFileStream(fileName)可以返回ftp文件的输入流 ,但输入流关闭(inputStream.close())之后返回的inputStream对象就为空,可以通过字节数组byte[]保存后返回出去再new ByteArrayInputStream(bytes)方法重新获得输入流。
/**
* 获取ftp上文件的InputStream
* @param ftpDirName ftp文件夹名称
* @param ftpFileName ftp文件名称
* @return
*/
public byte[] getInputStream(String ftpDirName, String ftpFileName) {
try {
if ("".equals(ftpDirName)) {
ftpDirName = "/";
}
String dir = new String(ftpDirName.getBytes("GBK"), "iso-8859-1");
if (!ftp.changeWorkingDirectory(dir)) {
System.out.println("切换目录失败:" + ftpDirName);
return null;
}
// 一定要加上字符集指定,因为获取文件时有中文,会出现乱码而获取不到。
String fileName = new String(ftpFileName.getBytes("GBK"), "iso-8859-1");
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据,ftp server可能每次开启不同的端口来传输数据,
// 但是在Linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
ftp.enterLocalPassiveMode();
InputStream inputStream = ftp.retrieveFileStream(fileName);
byte[] bytes = IOUtils.toByteArray(inputStream);
if (inputStream != null) {
inputStream.close();
}
ftp.getReply();
ftp.logout();
return bytes;
} catch (Exception e) {
log.error("获取文件流出现异常", e);
return null;
}
}
调用时代码如下:
byte[] inputStream = ftpHelper.getInputStream(ECG_PATH, fileName);
InputStream fileStream = new ByteArrayInputStream(inputStream);