ftpClient.retrieveFileStream导致FTPClient的后面操作失败
2024-08-25 22:13:19
问题代码:
FTPFile[] fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
in = ftpClient.retrieveFileStream(fileName);
}
}
原因:
官方说法是:完成文件传输必须调用completependingcommand和检查它的返回值来验证成功。如果没有这样做,后续命令可能会意外地出错
简单来说:completePendingCommand()会一直在等FTP Server返回226 Transfer complete,但是FTP Server只有在接受到InputStream执行close方法时,才会返回。所以先要执行close方法
在使用public InputStream retrieveFileStream(String remote)
需要特别注意:
调用这个接口后,一定要手动close掉返回的InputStream,然后再调用completePendingCommand方法,若不是按照这个顺序,则会导致后面对FTPClient的操作都失败
解决方案:
1. 关闭流,调用completePendingCommand()方法
InputStream in = ftpClient.retrieveFileStream(fileName);
in.close();
ftpClient.completePendingCommand();
2. 生成临时文件转换层流返回
//生成临时文件
File tempFile = new File(localPath, localFileName);
OutputStream outputStream = new FileOutputStream(tempFile);
//检索指定从服务器上的文件并将其写入给定的输出流
ftpClient.retrieveFile(fileName, outputStream);
outputStream.close();
InputStream inputStream = new FileInputStream(tempFile);
3 . 调用ftpClient.retrieveFile(fileName, outputStream)
File file = new File(filePath, fileName);
OutputStream outputStream = new FileOutputStream(file);
//检索指定从服务器上的文件并将其写入给定的输出流
ftpClient.retrieveFile(fileName, outputStream);
最新文章
- 【java】:常用工具类
- cocos2d-x 3.6 mac下的试用(粒子,触摸事件,图片)
- 扫描二维码下载安装apk的app
- sql截取查询
- Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
- MyBatis3.1 学习教程
- Linux命令--链接文件的那些事
- 【转】细说 Form (表单)
- 【转】动态字节码技术跟踪Java程序
- Hadoop - 操作练习之单机配置 - Hadoop2.8.0/Ubuntu16.04
- java对Microsoft Document的操作--->;对Excel的操作
- java 学习笔记 读取配置文件的三种方式
- PHP拓展配置redis、phalcon
- 《java入门第一季》之泛型引入
- 从0打卡leetcode之day 3 -- 最大子序列和
- python 云打码 http接口
- [Java] 各种流的分类及区别
- day7 回顾
- TAC队--团队选题报告
- 自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用