Java FTP Apache Commons-Net在某些服务器上慢速下载文件(可能与ProFTPD相关吗?)

时间:2017-04-03 20:15:04

标签: java ftp apache-commons-net proftpd

我曾尝试使用Apache Commons Net 3.5来保存来自FTP服务器的文件。 大多数情况下,我的代码工作正常,文件下载的速度非常快。 有几个FTP服务器我试图保存文件。当我尝试下载文件时,其中一些非常慢。即使是小的1000字节文件也需要长达30秒。使用像WinSCP这样的程序时,传输速率很好。 我不确定,但它可能只发生在ProFTPD服务器上。至少我试过的所有ProFTPD服务器都很慢,而所有noneProFTPD-Servers都没问题。 (小样本,可能是巧合)

我无法更改任何特定于FTP服务器端的配置文件,因为我无法访问它们。只有改变我的Java代码的可能性,希望这已经足够了,因为像WinSCP这样的其他程序没有这个问题。

这是我的代码。 (删除了一些验证/句柄代码)

连接:

public boolean connect() {
    ftp = new FTPClient();
    ftp.setAutodetectUTF8( true );
    try {
        ftp.connect(host,port);
        int reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            //handle that...
        }

        ftp.login(username, password);
        ftp.setFileType(FTP.BINARY_FILE_TYPE);
        ftp.enterLocalPassiveMode();
        ftp.setBufferSize(1024*1024);

        return true;
    } catch (SocketException e) {
        //handle..
    } catch (IOException e) {
        //handle...
    } 

    return false;
}

下载:

public void downloadAll(String base, String downBase){
    try {

        ftp.changeWorkingDirectory(base);
        System.out.println("Current directory is " +  ftp.printWorkingDirectory());
        FTPFile[] ftpFiles = ftp.listFiles();


        if (ftpFiles != null && ftpFiles.length > 0) {

            for (FTPFile file : ftpFiles) {
                if (!file.isFile()) {
                    continue;
                }
                System.out.println("File is " + file.getName());


                File f = new File(downBase);
                f.mkdirs();
                OutputStream output = new BufferedOutputStream(
                     new FileOutputStream(downBase+ file.getName()));

                InputStream inputStream = ftp.retrieveFileStream(file.getName());
                byte[] bytesArray = new byte[1024*1024];
                int bytesRead = -1;
                while ((bytesRead = inputStream.read(bytesArray)) != -1) {
                    output.write(bytesArray, 0, bytesRead);
                }

                ftp.completePendingCommand();

                output.close();
                inputStream.close();
            }
        }
    } catch (IOException e) {
        // handle...
    }
}

下载所有内容后,我正在关闭FTP客户端。

我的研究根本没有帮助我。 有一些人说,他们的FTP下载速度很慢。但就我而言,这仅适用于特定服务器。在大多数服务器上它真的很棒!

我尝试了不同的缓冲区大小。

我希望你能帮我解决这个问题。随意询问您需要的任何信息!

Knappe

修改

output = new FileOutputStream(downBase+ file.getName());        
ftp.retrieveFile(file.getName(), output);
output.close();

似乎可以解决这个问题! 我用这种方式在我的第一个程序版本中检索文件,但我还有其他问题。我不记得确切的问题:-D。

我仍然没有任何线索,为什么其他代码无法正常工作。 谢谢!

0 个答案:

没有答案