Java FTPClient(org.apache.commons.net.ftp.FTPClient)无法检索大型xml文件
我的ftp位置中有三种不同大小的文件,分别为2KB、76KB和216MB。我必须一个接一个地处理这些文件,我可以使用retrieveFileStream(这里是FILE_NAME_)轻松地检索前两个文件,但是当处理第三个文件时,它会花费很长时间(我的应用程序一直挂起),没有结果。我必须将这些文件作为输入流,并在以后从中生成jaxb对象。这是我用来获取输入流的实用方法:Java FTPClient(org.apache.commons.net.ftp.FTPClient)无法检索大型xml文件,java,ftp,apache-commons-net,Java,Ftp,Apache Commons Net,我的ftp位置中有三种不同大小的文件,分别为2KB、76KB和216MB。我必须一个接一个地处理这些文件,我可以使用retrieveFileStream(这里是FILE_NAME_)轻松地检索前两个文件,但是当处理第三个文件时,它会花费很长时间(我的应用程序一直挂起),没有结果。我必须将这些文件作为输入流,并在以后从中生成jaxb对象。这是我用来获取输入流的实用方法: public InputStream convertToInputStream(FTPFile file) throws IOE
public InputStream convertToInputStream(FTPFile file) throws IOException{
if(file!=null){
InputStream is=ftp.retrieveFileStream(file.getName());
ftp.completePendingCommand();
return is;
}
return null;
你能指出我在这里做错了什么吗?这对你来说可能太晚了(虽然可能会帮助其他人),但当我遇到类似的问题(上传和下载)时,我可以通过设置缓冲区大小setBufferSize()来解决问题,连接后请参见下面的代码片段。这使我上传240MB文件的时间从12分钟缩短到18秒,下载速度也有了类似的提高 我将BUFFER_的大小设置为32768,但8192的效果也差不多,特别是对于小于50MB的文件,在这之后,较大的文件大小略有改善
if (this.ftpClient.isConnected())
{
this.ftpClient.enterLocalPassiveMode();
this.ftpClient.setBufferSize(BUFFER_SIZE);
try
{
this.ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
}
catch (IOException e)
{
log.error(e.getLocalizedMessage(), e);
throw Throwables.propagate(e);
}
}
希望这有帮助。您对InputStream做了什么?写入硬盘?还是把所有的东西都留在记忆里?尝试使用-xmxjvm选项来增加堆大小?它“挂起”在哪一行代码中?我必须先将它保存在内存中以解组它,如果解组成功,那么我必须将该流(以文件的形式)存储在网络驱动器中,我不能先存储它,因为如果我无法处理该输入流文件,我不应该保存它。这是要求。在
ftp.completePendingCommand()时失败代码>我将sysout命令放在InputStream is=ftp.retrieveFileStream(file.getName())前后代码>和我可以看到两个系统输出都在编写中,但是如果completePendingCommand
有更大的文件,它就不会前进。