我曾尝试使用Apache Commons Net 3.5来保存来自FTP服务器的文件。 大多数情况下,我的代码工作正常,文件下载的速度非常快。 有几个FTP服务器我试图保存文件。当我尝试下载文件时,其中一些非常慢。即使是小的1000字节文件也需要长达30秒。使用像WinSCP这样的程序时,传输速率很好。 我不确定,但它可能只发生在ProFTPD服务器上。至少我试过的所有ProFTPD服务器都很慢,而所有noneProFTPD-Servers都没问题。 (小样本,可能是巧合)
我无法更改任何特定于FTP服务器端的配置文件,因为我无法访问它们。只有改变我的Java代码的可能性,希望这已经足够了,因为像WinSCP这样的其他程序没有这个问题。
这是我的代码。 (删除了一些验证/句柄代码)
连接:
public boolean connect() {
ftp = new FTPClient();
ftp.setAutodetectUTF8( true );
try {
ftp.connect(host,port);
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
//handle that...
}
ftp.login(username, password);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
ftp.setBufferSize(1024*1024);
return true;
} catch (SocketException e) {
//handle..
} catch (IOException e) {
//handle...
}
return false;
}
下载:
public void downloadAll(String base, String downBase){
try {
ftp.changeWorkingDirectory(base);
System.out.println("Current directory is " + ftp.printWorkingDirectory());
FTPFile[] ftpFiles = ftp.listFiles();
if (ftpFiles != null && ftpFiles.length > 0) {
for (FTPFile file : ftpFiles) {
if (!file.isFile()) {
continue;
}
System.out.println("File is " + file.getName());
File f = new File(downBase);
f.mkdirs();
OutputStream output = new BufferedOutputStream(
new FileOutputStream(downBase+ file.getName()));
InputStream inputStream = ftp.retrieveFileStream(file.getName());
byte[] bytesArray = new byte[1024*1024];
int bytesRead = -1;
while ((bytesRead = inputStream.read(bytesArray)) != -1) {
output.write(bytesArray, 0, bytesRead);
}
ftp.completePendingCommand();
output.close();
inputStream.close();
}
}
} catch (IOException e) {
// handle...
}
}
下载所有内容后,我正在关闭FTP客户端。
我的研究根本没有帮助我。 有一些人说,他们的FTP下载速度很慢。但就我而言,这仅适用于特定服务器。在大多数服务器上它真的很棒!
我尝试了不同的缓冲区大小。
我希望你能帮我解决这个问题。随意询问您需要的任何信息!
Knappe
修改
output = new FileOutputStream(downBase+ file.getName());
ftp.retrieveFile(file.getName(), output);
output.close();
似乎可以解决这个问题! 我用这种方式在我的第一个程序版本中检索文件,但我还有其他问题。我不记得确切的问题:-D。
我仍然没有任何线索,为什么其他代码无法正常工作。 谢谢!