Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FTPClient(org.apache.commons.net.ftp.FTPClient)无法检索大型xml文件_Java_Ftp_Apache Commons Net - Fatal编程技术网

Java FTPClient(org.apache.commons.net.ftp.FTPClient)无法检索大型xml文件

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

我的ftp位置中有三种不同大小的文件,分别为2KB、76KB和216MB。我必须一个接一个地处理这些文件,我可以使用retrieveFileStream(这里是FILE_NAME_)轻松地检索前两个文件,但是当处理第三个文件时,它会花费很长时间(我的应用程序一直挂起),没有结果。我必须将这些文件作为输入流,并在以后从中生成jaxb对象。这是我用来获取输入流的实用方法:

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
有更大的文件,它就不会前进。