12

Apache Commons FTPClient を使用して大きなファイルをアップロードしていますが、転送速度は FTP 経由で Wi​​nSCP を使用した場合の転送速度のほんの一部です。転送を高速化するにはどうすればよいですか?

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

4 に答える 4

33

バッファ サイズを増やします。

client.setBufferSize(1024000);
于 2013-02-02T11:07:55.790 に答える
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();
于 2013-01-19T21:21:53.233 に答える
1

Java 1.7 および Commons Net 3.2 には既知の問題があります。バグはhttps://issues.apache.org/jira/browse/NET-493です。

これらのバージョンを実行している場合は、最初のステップとして Commons Net 3.3 にアップグレードすることをお勧めします。どうやら 3.4 では、パフォーマンスの問題もさらに修正されているようです。

于 2013-12-11T02:50:58.347 に答える