[Java] File-Downloader (DLs wieder aufnehmen)

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von gateway_2_hell, 23. September 2006 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 23. September 2006
    File-Downloader (DLs wieder aufnehmen)

    Hallo!

    Ich habe ein Programm geschrieben, dass Dateien downloaden kann. Das ganze funktioniert recht gut, nur leider habe ich während eines Downloads immer 100% CPU-Auslastung...
    Wenn ich mit nem BuffereadReader und nem PrintWriter arbeite, habe ich eine ganz normale CPU-Auslastung, es wird auch was gedownloaded, aber die Datei ist nachher unbrauchbar.

    Ich weiß echt nich woran das liegt. Hoffe einer von euch kann mir helfen.


    Code:
    public void downloaden()
     {
     try 
     {
     this.download.createNewFile();
     InputStream reader = this.pathtoFile.openStream();
     FileOutputStream streamOut = new FileOutputStream(this.download,true);
     
     byte a = (byte) reader.read();
     while(a != -1 || reader.available() > 0)
     {
     streamOut.write(a);
     a = (byte) reader.read();;
     }
     
     reader.close();
     streamOut.close();
     
     
     } 
     catch (Exception e) 
     {
     //Fehlerbehandlung
     }
    


    greetz hell
     
  2. 23. September 2006
    AW: File-Downloader

    Die 100% CPU Auslastung kannste meistens umgehen indem du eine Verzögerung in die while-Schleife einbaust:
    Code:
    try
    {
     Thread.sleep( 10 ); //10ms pausieren
    }
    catch( InterupptedException e )
    {}
     
  3. 23. September 2006
    AW: File-Downloader

    Das hatte ich auch schon probiert:


    Code:
    public void downloaden()
     {
     try 
     {
     this.download.createNewFile();
     InputStream reader = this.pathtoFile.openStream();
     FileOutputStream streamOut = new FileOutputStream(this.download,true);
     
     byte a = (byte) reader.read();
     while(a != -1 || reader.available() > 0)
     {
     try
     {
     Thread.sleep( 10 ); //10ms pausieren
     }
     catch( InterruptedException e )
     {
     
     }
     streamOut.write(a);
     a = (byte) reader.read();;
     }
     
     reader.close();
     streamOut.close();
     
     
     } 
     catch (Exception e) 
     {
     //error
     }
     
     }
    

    Das führt dann dazu, dass pro Sekunde so um die 20 Bytes in die Datei geschrieben werden und der Download nie fertig wird. Obwohl ich diese langsame Geschwindigkeit komisch finde, bei ner Wartezeit von 10 Millisekunden.

    Du meinstest das doch so oder?



    hell
     
  4. 23. September 2006
    AW: File-Downloader

    Also bin noch mal drüber geflogen und würde auch einen Buffer verwenden der größer als 1 ist, dann gehts def. schneller (habs getestet):
    Code:
    public void downloaden()
    {
     try 
     {
     this.download.createNewFile();
     InputStream reader = this.pathtoFile.openStream();
     FileOutputStream streamOut = new FileOutputStream(this.download,true);
     
     byte buf[] = new byte[4096];
     int len;
     while( ( len = reader.read( buf ) ) > 0 )
     {
     streamOut.write( buf, 0, len );
     }
     
     reader.close();
     streamOut.close();
    } 
    catch (Exception e) 
    {
    //error
    }
    }
     
  5. 23. September 2006
    AW: File-Downloader

    Hey danke!


    Hab dich erstmal bewertet Das klappt echt super.

    Kannst du mir auch noch nen Tipp geben, wie ich an die Gesamtgröße der Datei komme, die ich laden will, bevor sie ganz runtergeladen ist?



    greetz hell
     
  6. 23. September 2006
    AW: File-Downloader

    Kannst du machen mit:
    Code:
    URLConnection urlConnection = this.pathtoFile.openConnection();
    long sizeInBytes = urlConnection.getContentLength();
    .
    .
    .
    InputStream reader = urlConnection.getInputStream(); //Die andere Zeile hiermit ersetzten
     
  7. 23. September 2006
    AW: File-Downloader

    danke
     
  8. 26. September 2006
    AW: File-Downloader

    Hallo!


    Ich bin mit meinem Programm recht gut vorangekommen. Es läuft jetzt alles super, eine Pause-Funktion habe ich auch eingebaut.

    Ich will nun die Möglichkeit implementieren, dass man abgebrochene Downloads später fortsetzen kann. Das funktioniert nun wohl doch nicht so ganz einfach...


    In dem Fall, dass eine Datei schon zum Teil vorhanden ist, geschiet folgendes:

    Code:
    if(this.resume) 
    {
     long größebisher = this.rafdownload.length();
    
     if(größebisher < größeDatei) 
     {
     this.resumeLabel.setVisible(true);
     this.rafdownload.seek(größebisher);
     reader.skip(größebisher);
     gesamtgeladen += größebisher; //Die sind ja schon geladen worden
     }
     }
    

    Zur Erläuterung:
    rafdownload ist ein RandomAccessFile. Ich glaube, dass die Methode seek richtig arbeitet, der Zeiger von dem File springt glaub ich an die richtige Stelle.

    reader ist der InputStreamReader, der von der URL liest. Die Methode seek scheint nicht richtig zu funzen. Wenn ich z.B. ein Bild nur zum Teil lade, und dann später (nach neustart meines Programmes) den Download fortsetzen will, dann packt er unter den bereits geladenen Teil des Bildes, eine "verkümmerte" Version des Bildes, er läd also nicht an der richtigen Stelle weiter.


    Hoffe das ist so verständlich. Sonst werd ich das noch näher erläutern


    greetz hell



    //Jetzt habe ich das ganze mal an einer 6 mb Datei probiert.
    Habe bis zur Hälfte also bis 3 mb gedownloadet und dann das Programm geschlossen.
    Dann habe ich den Download wieder aufgenommen und er hat auch weitergeladen. Aber am Ende hat mein Download-Counter angezeigt, dass ich 9 mb geladen hätte... Er hat also echt wieder von Vorne angefangen... versteh das nicht
     
  9. 27. September 2006
    AW: File-Downloader

    So...


    hab herausgefunden, dass die Methode .skip() nicht alles auf einmal skippen kann. Ich zwinge sie jetzt dazu, durch mehrmaligen Aufruf von .skip(). Nur dummerweise habe ich beim .skip() - Aufruf trotzdem Traffif

    Dann bringt mir die Methode auch nicht mehr viel. Ich will ja eben den Download fortsetzen und nicht alles neu laden!



    Kann mir wer helfen?



    //Edit

    Ach, es steht ja auch so in er API:

    The skip method of InputStream

    creates a byte array and then repeatedly reads into it

    until n bytes have been read or the end of the stream has been reached. Subclasses are encouraged to provide a more efficient implementation of this method



    Hat jemand eine Idee, wie ich es schaffe, dass ein Download wieder aufgenommen wird?
     
  10. 29. September 2006
    AW: File-Downloader (DLs wieder aufnehmen)

    So Hier mal wie du das machen kannst:
    Code:
     HttpURLConnection con = (HttpURLConnection) this.pathtoFile.openConnection();
    con.addRequestProperty("Range", "bytes="+größebisher+"-" ); //evtl ..+(größebisher - 1)+.. - musst du testen
    con.connect();
    .
    .
    .
    InputStream in = con.getInputStream();
    
     
  11. 29. September 2006
    AW: File-Downloader (DLs wieder aufnehmen)

    yeah das ja der Hammer!


    geht super danke
     
  12. 29. September 2006
    AW: File-Downloader (DLs wieder aufnehmen)

    [X] Erledigt ?!

    ~closed~

    Mfg,

    Kolazomai
     
  13. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.