问题代码:

 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);

最新文章

  1. 【java】:常用工具类
  2. cocos2d-x 3.6 mac下的试用(粒子,触摸事件,图片)
  3. 扫描二维码下载安装apk的app
  4. sql截取查询
  5. Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
  6. MyBatis3.1 学习教程
  7. Linux命令--链接文件的那些事
  8. 【转】细说 Form (表单)
  9. 【转】动态字节码技术跟踪Java程序
  10. Hadoop - 操作练习之单机配置 - Hadoop2.8.0/Ubuntu16.04
  11. java对Microsoft Document的操作--->对Excel的操作
  12. java 学习笔记 读取配置文件的三种方式
  13. PHP拓展配置redis、phalcon
  14. 《java入门第一季》之泛型引入
  15. 从0打卡leetcode之day 3 -- 最大子序列和
  16. python 云打码 http接口
  17. [Java] 各种流的分类及区别
  18. day7 回顾
  19. TAC队--团队选题报告
  20. 自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用

热门文章

  1. ubuntu系统中解决github下载速度慢问题
  2. jdbc注册驱动 class.forName()
  3. 共享keychain数据
  4. UVa 10537 The Toll! Revisited (最短路)
  5. 桥接模式及C++实现
  6. TypeToken 是google提供的一个解析Json数据的类库中一个类
  7. SqlServer 的一个坑
  8. 【javascript】点击复制内容的实现
  9. airport 抓包
  10. C#学习(1):类型约束