Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
3.3
-
None
-
None
Description
While experimenting with FTPClient, I discovered that if I don't call setBufferSize(), the default value is zero. This results in retrieveFile() calling the version of InputStream.read() with no parameters, reading one byte at a time. For comparison, the downloading a CD ISO image of about ~648MB took 18m10s with the default settings. In contrast, calling setBufferSize(8192) took only 7.9s, an improvement of ~137x.
Here is some sample code:
FTPClient ftp = new FTPClient(); // ftp.setBufferSize(8192); ftp.setControlKeepAliveTimeout(300); ftp.setCopyStreamListener(new CopyStreamListener() { @Override public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { System.out.println("totalBytesTransferred: " + totalBytesTransferred + ", bytesTransferred: " + bytesTransferred + ", streamSize: " + streamSize); } @Override public void bytesTransferred(CopyStreamEvent event) {} }); ftp.connect(host); ftp.login(user, pass); ftp.retrieveFile(file, outputStream);
The log message from the stream listener printed lots messages "bytesTransferred: 1" and totalBytesTransferred incremented by 1 each time. This corresponds to the part of the code which reads one byte at a time with int inputStream.read().