我尝试使用 Apache Commons Net 3.5 从 FTP 服务器保存文件。大多数情况下,我的代码可以正常工作,并且下载文件的速度非常快。我尝试从多个 FTP 服务器保存文件。当我尝试下载文件时,其中一些真的很慢。即使是 1000 字节的小文件也需要长达 30 秒。使用 WinSCP 之类的程序时,传输速率很好。我不确定,但它可能只发生在 ProFTPD 服务器上。至少我尝试过的所有 ProFTPD-Servers 都很慢,而所有 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 下载时间很慢。但就我而言,这仅在特定服务器上。在大多数服务器上,它真的很好!
我尝试了不同的缓冲区大小。
我希望你能帮我解决这个问题。随时询问您需要的任何信息!
纳普
编辑:
output = new FileOutputStream(downBase+ file.getName());
ftp.retrieveFile(file.getName(), output);
output.close();
似乎解决了这个问题!我用这种方式在我的第一个版本的程序中检索文件,但我遇到了其他问题。我不记得确切的问题:-D。
我仍然没有任何线索,为什么其他代码无法正常工作。谢谢!