2017-10-10 3 views
0

Weiß jemand, wie man Datei vom Internet unter Verwendung der URL (http://.../File.mp4) herunterlädt? Ich versuche NIO zu verwenden, aber der Stream endet immer bei Integer.MAX_VALUE. Meine Datei ist 2,5 GB.Java - Wie man eine Datei von der URL herunterlädt, größer als Integer.MAX_VALUE

Mein 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

Willkommen bei Stack Overflow! Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht?") Müssen das gewünschte Verhalten, ein spezifisches Problem oder einen Fehler und den kürzesten Code enthalten, der für die Reproduktion in der Frage erforderlich ist. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines [mcve]. Verwenden Sie den Link "Bearbeiten", um Ihre * Frage * zu verbessern - fügen Sie keine weiteren Informationen über Kommentare hinzu. Vielen Dank! – GhostCat

+0

Nicht auf eine externe Seite verlinken - Beispielcode hier angeben, innerhalb Ihrer Frage! – GhostCat

+0

Ich vermute, dass Sie eine 'HttpURLConnection' oder etw. Verwenden. ähnlich, die einen 'ByteArrayInputStream' verwendet. Dies wiederum verwendet ein Byte [] 'und Java-Arrays haben eine maximale Länge von" Integer.MAX_VALUE ". – Thomas

Antwort

0

Versuchen ändern if (remain < 0)-if (remain <= 0)

+0

Dies bietet keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/17580908) – Assafs

1

Verwenden lange Version:

long remain = connection.getContentLengthLong(); 

Tipp:, wenn die Datei auf einen Bruchteil komprimiert werden serviert könnte, Sie könnten einen entsprechenden Accept-Header senden und optional den Stream in einen GZipInputStream umbrechen.

Verwandte Themen