1

我尝试使用 Apache Commons Net 3.5 从 FTP 服务器保存文件。大多数情况下,我的代码可以正常工作,并且下载文件的速度非常快。我尝试从多个 FTP 服务器保存文件。当我尝试下载文件时,其中一些真的很慢。即使是 1000 字节的小文件也需要长达 30 秒。使用 WinSCP 之类的程序时,传输速率很好。我不确定,但它可能只发生在 ProFTPD 服务器上。至少我尝试过的所有 ProFTPD-Servers 都很慢,而所有 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 下载时间很慢。但就我而言,这仅在特定服务器上。在大多数服务器上,它真的很好!

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

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

纳普

编辑:

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

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

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

4

0 回答 0