在Java中恢复HTTP文件下载

URL url = new URL("http://download.thinkbroadband.com/20MB.zip"); URLConnection connection = url.openConnection(); File fileThatExists = new File(path); OutputStream output = new FileOutputStream(path, true); connection.setRequestProperty("Range", "bytes=" + fileThatExists.length() + "-"); connection.connect(); int lenghtOfFile = connection.getContentLength(); InputStream input = new BufferedInputStream(url.openStream()); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; output.write(data, 0 , count); } 

在这段代码中,我尝试恢复下载。 目标文件是20MB。 但是,当我停止下载10MB,然后contunue,我得到文件大小为30MB的文件。 它似乎继续写入文件,但不能从服务器部分下载。 Wget -c对这个文件很好用。 我怎样才能恢复文件下载?

  HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if(ISSUE_DOWNLOAD_STATUS.intValue()==ECMConstant.ECM_DOWNLOADING){ File file=new File(DESTINATION_PATH); if(file.exists()){ downloaded = (int) file.length(); connection.setRequestProperty("Range", "bytes="+(file.length())+"-"); } }else{ connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); } connection.setDoInput(true); connection.setDoOutput(true); progressBar.setMax(connection.getContentLength()); in = new BufferedInputStream(connection.getInputStream()); fos=(downloaded==0)? new FileOutputStream(DESTINATION_PATH): new FileOutputStream(DESTINATION_PATH,true); bout = new BufferedOutputStream(fos, 1024); byte[] data = new byte[1024]; int x = 0; while ((x = in.read(data, 0, 1024)) >= 0) { bout.write(data, 0, x); downloaded += x; progressBar.setProgress(downloaded); } 

这不是我的代码,但它的工作原理。

我想你正面临的问题是在url.openStream()之后调用url.openConnection()

url.openStream()相当于url.openConnection().getInputStream() 。 因此,你正在请求两次URL。 特别是第二次,它没有指定范围属性。 因此下载总是从头开始。

你应该用url.openStream()replaceurl.openStream() connection.getInputStream()

看看这个线程有一个类似于你的问题 。 如果wget正在工作,那么服务器显然支持恢复下载。 它看起来像你没有设置上述链接的接受答案中提到的If-Range标题。 即。 加:

 // Initial download. String lastModified = connection.getHeaderField("Last-Modified"); // ... // Resume download. connection.setRequestProperty("If-Range", lastModified); 

由于这个问题被标记为Android:你有没有尝试过使用DownloadManager 。 它很好地处理所有这些东西。

这个怎么样?

 public static void download(DownloadObject object) throws IOException{ String downloadUrl = object.getDownloadUrl(); String downloadPath = object.getDownloadPath(); long downloadedLength = 0; File file = new File(downloadPath); URL url = new URL(downloadUrl); BufferedInputStream inputStream = null; BufferedOutputStream outputStream = null; URLConnection connection = url.openConnection(); if(file.exists()){ downloadedLength = file.length(); connection.setRequestProperty("Range", "bytes=" + downloadedLength + "-"); outputStream = new BufferedOutputStream(new FileOutputStream(file, true)); }else{ outputStream = new BufferedOutputStream(new FileOutputStream(file)); } connection.connect(); inputStream = new BufferedInputStream(connection.getInputStream()); byte[] buffer = new byte[1024*8]; int byteCount; while ((byteCount = inputStream.read(buffer)) != -1){ outputStream.write(buffer, 0, byteCount); break; } inputStream.close(); outputStream.flush(); outputStream.close(); } 

使用break; testing代码..;)

我有一个方法让你的代码工作。

  1. 首先,检查文件是否退出
  2. 如果文件存在,请设置连接:

     connection.setRequestProperty("Range", "bytes=" + bytedownloaded + "-"); 
  3. 如果文件不存在,请在新文件中进行相同的下载。