Ускорить передачу Apache Commons FTPClient

Я использую FTPClient Apache Commons для загрузки больших файлов, но скорость передачи данных составляет лишь небольшую часть скорости передачи, используя WinSCP через FTP. Как ускорить мой перевод?

    public boolean upload(String host, String user, String password, String directory, 
        String sourcePath, String filename) throws IOException{

    FTPClient client = new FTPClient();
    FileInputStream fis = null;

    try {
        client.connect(host);
        client.login(user, password);
        client.setControlKeepAliveTimeout(500);

        logger.info("Uploading " + sourcePath);
        fis = new FileInputStream(sourcePath);        

        //
        // Store file to server
        //
        client.changeWorkingDirectory(directory);
        client.setFileType(FTP.BINARY_FILE_TYPE);
        client.storeFile(filename, fis);
        client.logout();
        return true;
    } catch (IOException e) {
        logger.error( "Error uploading " + filename, e );
        throw e;
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
            client.disconnect();

        } catch (IOException e) {
            logger.error("Error!", e);
        }
    }         
}

Ответ 1

Увеличьте размер буфера:

client.setBufferSize(1024000);

Ответ 2

используйте метод outputStream и передайте его с помощью буфера.

InputStream inputStream = new FileInputStream(myFile);
OutputStream outputStream = ftpclient.storeFileStream(remoteFile);

byte[] bytesIn = new byte[4096];
int read = 0;

while((read = inputStream.read(bytesIn)) != -1) {
    outputStream.write(bytesIn, 0, read);
}

inputStream.close();
outputStream.close();

Ответ 3

Известен выпущенный с Java 1.7 и Commons Net 3.2, ошибка https://issues.apache.org/jira/browse/NET-493

Если вы используете эти версии, я бы предложил обновление до Commons Net 3.3 в качестве первого шага. По-видимому, 3.4 исправляет и другие проблемы с производительностью.

Ответ 4

Было бы лучше, если бы вы использовали ftp.setbuffersize(0); если вы используете 0 в качестве буферизации, он будет иметь размер бесконечного буфера. очевидно, ур транзакция ускорится... Я лично испытал это. все лучшее...:)