我正在开发一个应用程序,它必须从服务器下载到客户端一些非常大的文件。到目前为止,我正在使用apache commons-net:
FileOutputStream out = new FileOutputStream(file);
client.retrieveFile(filename, out);
在客户端完成下载文件之前,连接通常会失败。我需要一种方法从连接失败的地方恢复文件下载,而不再重新下载整个文件,是否可能?
答案 0 :(得分:3)
要了解的事情:
FileOutputStream有一个append参数,来自doc;
@param追加
true
,然后写入字节 到文件的末尾而不是开头
FileClient具有setRestartOffset,它将偏移量作为参数来自doc;
@param offset远程文件中要启动的偏移量 下一次文件传输。这必须是大于或的值 等于零。
我们需要将这两者结合起来;
boolean downloadFile(String remoteFilePath, String localFilePath) {
try {
File localFile = new File(localFilePath);
if (localFile.exists()) {
// If file exist set append=true, set ofset localFile size and resume
OutputStream fos = new FileOutputStream(localFile, true);
ftp.setRestartOffset(localFile.length());
ftp.retrieveFile(remoteFilePath, fos);
} else {
// Create file with directories if necessary(safer) and start download
localFile.getParentFile().mkdirs();
localFile.createNewFile();
val fos = new FileOutputStream(localFile);
ftp.retrieveFile(remoteFilePath, fos);
}
} catch (Exception ex) {
System.out.println("Could not download file " + ex.getMessage());
return false;
}
}
答案 1 :(得分:2)
Commons-net FTPClient
支持从特定偏移量重新启动传输。您必须跟踪已成功检索的内容,发送正确的偏移量,并管理附加到现有文件。当然,假设您连接的FTP服务器支持REST
(重启)命令。