# Download-Fortschritt wird falsch angezeigt.



## clausismus (12. Dez 2008)

Hi,

hier erstmal bisschen Code:

Eine statische Funktion zum Herunterladen einer Datei.
theURL - Gibt die URL die Datei an die heruntergeladen werden soll.
outputPath - Gibt den Pfad an, wo die Datei gespeichert werden soll.
fullsize - Die größe der Datei, die man herunterladen will in bytes.
de - Eine Schnittstelle für Ereignisse-Aktionen beim herunterladen.

```
public static boolean downloadFile(URL theURL, String outputPath, long fullsize, DownloadEvents de) throws Exception {
        URLConnection con;

        con = theURL.openConnection();
        con.connect();

        String type = con.getContentType();

        if (type != null) {
            byte[] buffer = new byte[4 * 1024]; // Größe eines IP-Paketes
            int read;

            FileOutputStream os = new FileOutputStream(outputPath);
            InputStream in = con.getInputStream();
            int i = 0;
            while ((read = in.read(buffer)) > 0) {
                if(de!=null) de.downloading(outputPath, theURL, (i * 4 * 1024), fullsize); // <--  Soll ein Fortschrittsbalken werden
                os.write(buffer, 0, read);
                i = i + 1;
            }

            os.close();
            in.close();

            return true;
        }
        else {
            return false;
        }
    }
```

Schnittstelle die für Ereignisse beim Herunterladen gedacht ist.

```
public interface DownloadEvents  {
    public void downloading(String filename, URL url, long size, long fullsize);
    public void downloadSuccessful();
    public void downloadFailed(Exception e);
}
```

Ein Objekt das den DownloadEvents-Schnittstelle besitzt.
Dies nutze ich zur Ausgabe des Fortschritts eines Download (Prozentanzeige)

```
public void downloading(String filename, URL url, long size, long fullsize) {
        float downloadInPercent = (size * 100) / (float)fullsize;
        System.out.println("   Downloading: " + size + " - " + fullsize + " - " + downloadInPercent + " %");
    }
```


Wenn ich die statische Funktion "downloadFile(URL theURL, String outputPath, long fullsize, DownloadEvents de)" ausführe lädt die Funktion die Datei herunter, wobei jedes heruntergeladenes Paket gezählt wird.
Ich weiß wieviele Bytes ich schon heruntergeladen hab, durch das Zählen der Pakete, und die Information, das ein IP-Paket 4 Kilobyte groß sind.
Ich kenne schon die größe der Datei die ich herunterladen will, und wollte daher ein Fortschrittsanzeige für den Download machen.
Wenn ich jetzt aber eine Datei, die ca. 5 Megabyte groß ist herunterlade, lädt er ca. das 2,5 Fache an Bytes herunter, sprich ca. 14 Megabyte, und verfälscht die Fortschrittsanzeige.
Mir ist eingefallen, das ein IP-Paket z.B. die IP-Adresse des Senders und Empfängers beinhaltet, daher kann ja die Information die in dem IP-Paket steckt nicht 4 Kilo groß sein.
Ich habe bemerkt beim mehrmaligen Testen der Funktion, das die Funktion immer unterschiedlich viele IP-Pakete herunterlädt, obwohl es die gleiche Datei  auf dem Server ist.
Ich habe auch ein Checksumme, von der Datei, die ich hochgeladen hab, gemacht.
Hab die Datei wieder mit der Funktion heruntergeladen und von der auch eine Checksumme gemacht.
Beide Dateien sind identisch.

1. Wie kann es sein, dass die Funktion immer unterschiedlich viel IP-Pakete herunterlädt?
2. Wie löse ich das Problem mit der Forschrittsanzeige?


----------



## clausismus (13. Dez 2008)

Ich hab das Problem gelöst.

Hier die Lösung:


```
public static boolean downloadFile(URL theURL, String outputPath, long fullsize, DownloadEvents de) throws Exception {
        URLConnection con;

        con = theURL.openConnection();
        con.connect();

        String type = con.getContentType();

        if (type != null) {
            byte[] buffer = new byte[4 * 1024];
            int read;

            FileOutputStream os = new FileOutputStream(outputPath);
            InputStream in = con.getInputStream();
            long downloadedBytes = 0;
            while ((read = in.read(buffer)) > 0) {
                downloadedBytes = downloadedBytes + read;
                if(de!=null) de.downloading(outputPath, theURL ,downloadedBytes, fullsize);
                os.write(buffer, 0, read);
            }

            os.close();
            in.close();

            return true;
        }
        else {
            return false;
        }
    }
```


----------



## HoaX (13. Dez 2008)

> while ((read = in.read(buffer)) > 0) {



sollte auf != -1 prüfen!


----------

