恢复Java FTP文件下载

时间:2013-07-25 21:59:57

标签: java ftp apache-commons-net

我正在开发一个应用程序,它必须从服务器下载到客户端一些非常大的文件。到目前为止,我正在使用apache commons-net:

FileOutputStream out = new FileOutputStream(file);
client.retrieveFile(filename, out);

在客户端完成下载文件之前,连接通常会失败。我需要一种方法从连接失败的地方恢复文件下载,而不再重新下载整个文件,是否可能?

2 个答案:

答案 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(重启)命令。