2012-07-20 17 views
10

Estoy utilizando Apache Commons FTPClient para cargar archivos de gran tamaño, pero la velocidad de transferencia es solo una fracción de la velocidad de transferencia usando WinSCP a través de FTP. ¿Cómo puedo acelerar mi transferencia?Acelerar Apache Commons FTPClient Transfer

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); 
     } 
    }   
} 

Respuesta

26

Aumenta el tamaño del búfer:

client.setBufferSize(1024000); 
+1

La versión 3.3 de Apache sufre el problema de establecer BufferSize en cero, ya que usaría el valor predeterminado (8192) en lugar del valor ilimitado como se esperaba. – Thinhbk

+0

Tuve que actualizar de la versión 3.2 a la versión 3.5 y funcionó; de lo contrario, aún es lento. Tal vez 3.3 funciona sin embargo. – JohnyTex

2

utilice el método flujoSalida, y la transferencia con un tampón.

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(); 
+1

Esta respuesta me ayudó mucho. Se aceleró significativamente. –

0

Sería mejor si se utiliza ftp.setbuffersize (0); si usa 0 como su tamaño de búfer, tendrá un tamaño de búfer infinito. obviamente ur transacción conseguirá acelerado ... yo personalmente experimenté .. todo lo mejor ... :)

1

Hay un conocido emitida con Java 1.7 y 3.2 Commons Net, el error es https://issues.apache.org/jira/browse/NET-493

Si ejecuta estas versiones, sugeriría la actualización a Commons Net 3.3 como primer paso. Aparentemente 3.4 corrige más problemas de rendimiento también.

Cuestiones relacionadas