Riprendere il download di file http in java

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); } 

in questo codice cerco di riprendere il download. Il file di destinazione è di 20 MB. Ma quando arresto il download su 10mb, poi si contesta, ho file con fileize 30MB. Sembra che continui a scrivere in file, ma in parte scaricabile dal server. Wget -c funziona bene con questo file. Come posso riprendere il download dei file?

  • Come utilizzare le prese UDP in android?
  • Layout lineare e peso in Android
  • Come scrivere una moltiplicazione della convoluzione in Renderscript di Android?
  • Utilizzando android gradle + pugnale per eseguire instrumentTests
  • Impostazione di un server bluetooth bluetooth per Android
  • Come ritardare un ciclo in android senza utilizzare thread.sleep?
  • recyclerview android: come faccio a select in modo programmato il colore di background di TextView?
  • L'aggiornamento prende i dati di una row eliminata
  • Come serializzare Object a JSON?
  • Errore Qt Necessitas - Non è ansible trovare il servizio Ministro
  • Barra di stato trasparente non funziona con windowTranslucentNavigation = "false"
  • Modifica del colore della tinta di Android EditText a livello di programmazione
  • 6 Solutions collect form web for “Riprendere il download di file http in java”

      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); } 

    Questo non è il mio codice, ma funziona.

    Suppongo che il problema che stai affrontando sta chiamando url.openStream() dopo url.openConnection() .

    url.openStream() è equivalente a url.openConnection().getInputStream() . Quindi, si richiede l'url due volte. In particolare la seconda volta, non sta specificando la properties; della gamma. Quindi il download inizia sempre all'inizio.

    Dovresti sostituire url.openStream() con connection.getInputStream() .

    Controlla questo thread che ha un problema simile al tuo . Se wget funziona, il server support chiaramente il ripristino dei download. Sembra che imansible impostare l'intestazione If-Range come indicato nella risposta accettata del collegamento di cui sopra. vale a dire. Inserisci:

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

    Poiché la questione è contrassegnata con Android: Hai provato a utilizzare DownloadManager . Gestisce bene tutta questa roba per te.

    Cosa ne pensi di questo?

     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; usata break; per testare il codice ..;)

    Ho un modo per funzionare il tuo codice.

    1. In primo luogo, controllare se il file esce o no
    2. Se il file esiste, impostare la connessione:

       connection.setRequestProperty("Range", "bytes=" + bytedownloaded + "-"); 
    3. Se il file non esiste, eseguire lo stesso download in un nuovo file.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.