您的位置:首页 > 编程语言 > PHP开发

Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式

2015-08-05 14:39 645 查看
commons-net的FTPClient,在使用public InputStream retrieveFileStream(String remote)

方法时需要特别注意,在调用这个接口后,一定要手动close掉返回的InputStream,然后再调用completePendingCommand方法,若不是按照这个顺序,则不对,伪代码:

InputStream is = ftpClient.retrieveFileStream(remote);

is.close();

ftpClient.completePendingCommand();

retrieveFileStream的API文档说的有点罗嗦,还可以使用下列方法来替换上述使用方式
使用一个中间文件来做一个转接,这种方式比上述方法的好处就是自己容易控制,不容易出问题。伪代码如下:

File localFile = new File(localPath, localFileName);

OutputStream output = new FileOutputStream(localFile);

ftpClient.retrieveFile(remoteFileName, output);

output.close();

InputStream input = new FileInputStream(localFile);

关于原因这里有比较具体的分析:http://marc.info/?l=jakarta-commons-user&m=110443645016720&w=2
简单来说:completePendingCommand()会一直在等FTP Server返回226 Transfer complete,但是FTP Server只有在接受到InputStream执行close方法时,才会返回。所以先要执行close方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: