2012-07-20 31 views
10

Tôi đang sử dụng Apache Commons FTPClient để tải lên các tệp lớn, nhưng tốc độ truyền tải chỉ là một phần nhỏ của tốc độ truyền bằng WinSCP qua FTP. Làm thế nào tôi có thể tăng tốc độ chuyển giao của tôi?Tăng tốc Apache Commons FTPClient chuyển

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

Trả lời

26

Tăng kích thước bộ đệm:

client.setBufferSize(1024000); 
+1

Apache phiên bản 3.3 gặp sự cố khi đặt BufferSize thành 0, vì nó sẽ sử dụng giá trị mặc định (8192) thay vì giá trị không giới hạn như mong đợi. – Thinhbk

+0

Tôi đã phải cập nhật từ phiên bản 3.2 lên phiên bản 3.5 và nó hoạt động, nếu không vẫn còn chậm. Có lẽ 3,3 công trình mặc dù. – JohnyTex

2

sử dụng phương thức OutputStream và chuyển bằng bộ đệm.

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

Câu trả lời này đã giúp tôi rất nhiều. Nó tăng tốc đáng kể. –

0

Sẽ tốt hơn nếu bạn sử dụng ftp.setbuffersize (0); nếu bạn sử dụng 0 làm bộ đệm của bạn, nó sẽ lấy kích thước bộ đệm vô hạn. rõ ràng giao dịch ur sẽ được đẩy lên ... Cá nhân tôi trải qua nó .. mọi điều tốt đẹp ... :)

1

Có một nổi tiếng phát hành với Java 1.7 và Commons Net 3.2, lỗi này là https://issues.apache.org/jira/browse/NET-493

Nếu chạy các phiên bản này, tôi đề nghị nâng cấp lên Commons Net 3.3 là bước đầu tiên. Rõ ràng 3,4 sửa nhiều vấn đề về hiệu năng hơn.

Các vấn đề liên quan