2017-10-10 9 views
0

Est-ce que quelqu'un sait comment télécharger le fichier à partir d'Internet, en utilisant l'URL (http://.../File.mp4)? J'essaie d'utiliser NIO, mais toujours la fin du flux sur Integer.MAX_VALUE. Mon fichier est 2.5Go.Java- Comment télécharger le fichier de l'URL, plus grand que Integer.MAX_VALUE

Mon code:

String url = "http://.../Somefile.mp4"; 
    String filename = "Path/to/file/Something.mp4"; 

    boolean koncano = false; 
    URLConnection conn = new URL(url).openConnection(); 
    conn.setRequestProperty("Range", "bytes=" + new File(filename).length() + "-"); 
    ReadableByteChannel rbc = Channels.newChannel(conn.getInputStream()); 
    long remain = conn.getContentLength(); 
    FileOutputStream fos = new FileOutputStream(filename, true); 

    while (!koncano) { 
     long downloaded = new File(filename).length(); 
     long buffer = (remain > 65536) ? 1 << 16 : remain; 

     while (remain > 0) { 
      long write = fos.getChannel().transferFrom(rbc, downloaded, buffer); 
      downloaded += write; 
      remain -= write; 

      if (write == 0) { 
       break; 
      } 
     } 

     if (remain <= 0) { 
      System.out.println("File is complete"); 
      rbc.close(); 
      fos.close(); 
      koncano = true; 
     } 
    } 
+1

Bienvenue dans Stack Overflow! Les questions qui cherchent une aide au débogage («pourquoi ce code ne fonctionne-t-il pas?») Doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un [mcve]. Utilisez le lien "modifier" pour améliorer votre * question * - ne pas ajouter plus d'informations via des commentaires. Merci! – GhostCat

+0

Ne pas faire un lien vers un site externe - fournissez ici un exemple de code, dans votre demande! – GhostCat

+0

Je suppose que vous utilisez un 'HttpURLConnection' ou sth. similaire qui utilise un 'ByteArrayInputStream'. Cela à son tour utilise un 'byte []' et les tableaux Java ont une longueur maximale de 'Integer.MAX_VALUE'. – Thomas

Répondre

0

Essayez modifier if (remain < 0)-if (remain <= 0)

+0

Ceci ne fournit pas de réponse à la question question. Une fois que vous avez suffisamment [réputation] (https://stackoverflow.com/help/whats-reputation) vous pourrez [commenter n'importe quel article] (https://stackoverflow.com/help/privileges/comment); Au lieu de cela, [fournissez des réponses qui ne nécessitent pas de précisions de la part du demandeur] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- je-fais-à la place). - [De l'examen] (/ review/low-quality-posts/17580908) – Assafs

1

Utilisez la version longue:

long remain = connection.getContentLengthLong(); 

Astuce: si le fichier pourrait être servi comprimé à une fraction, vous pouvez envoyer un en-tête Accept correspondant et, le cas échéant, envelopper le flux dans un GZipInputStream.