Download limitieren

Nambot

Mitglied
Hi!
Ich probiere gerade mal wieder ein wenig mit Java herum. Ist schon länger her und ich habe auch schon mein erstes Problem.
Ich suche nach einer Lösung wie ich die benutzte Bandbreite eines Downloads limitieren kann. Ich lade eine Datei mittels HttpUrlConnection, diese wird allerdings immer mit der voll verfügbarer Bandbreite geladen. Dies würde ich gerne regeln können.
Wie mache ich das?
schonmal danke

nambot
 
Hallo,

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 * 
 */
public class ThrottledOutputStream extends FilterOutputStream {

    int maxKiloBytesPerSecond;
    long maxBytesPerMilliSecond;
    long startTimeMillis = -1;
    long overallBytesWritten;
    boolean verbose;

    public ThrottledOutputStream(OutputStream out) {
        super(out);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        super.write(b, off, len);
        overallBytesWritten += len - off;
        if (startTimeMillis == -1) {
            startTimeMillis = System.currentTimeMillis();
        } else {
            long deltaTimeMillis = System.currentTimeMillis() - startTimeMillis;
            long expectedBytesWritten = deltaTimeMillis
                    * maxBytesPerMilliSecond;

            if (verbose) {
                // TODO use a logger here
                System.out.printf("dt: %s, eobw: %s, obw: %s\n",
                        deltaTimeMillis, expectedBytesWritten,
                        overallBytesWritten);
            }

            if (expectedBytesWritten < overallBytesWritten) {
                long deltaBytesWritten = overallBytesWritten
                        - expectedBytesWritten;
                long timeToSleepInMilliSeconds = deltaBytesWritten
                        / maxBytesPerMilliSecond;
                if (timeToSleepInMilliSeconds > 0) {
                    if (verbose) {
                        // TODO use a logger here
                        System.out.println("Sleep: "
                                + timeToSleepInMilliSeconds);
                    }
                    try {
                        TimeUnit.MILLISECONDS.sleep(timeToSleepInMilliSeconds);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public int getMaxKiloBytesPerSecond() {
        return maxKiloBytesPerSecond;
    }

    public void setMaxKiloBytesPerSecond(int maxKiloBytesPerSecond) {
        this.maxKiloBytesPerSecond = maxKiloBytesPerSecond;
        this.maxBytesPerMilliSecond = maxKiloBytesPerSecond * 1024 / 1000;
    }

    public boolean isVerbose() {
        return verbose;
    }

    public void setVerbose(boolean verbose) {
        this.verbose = verbose;
    }

    public static void main(String[] args) throws Exception {
        File file = new File("c:/tmp/P4260910.JPG");
        FileInputStream inputStream = new FileInputStream(file);

        ThrottledOutputStream throttledOutputStream = new ThrottledOutputStream(
                new FileOutputStream("c:/tmp/test.dat"));
        throttledOutputStream.setVerbose(true);

        throttledOutputStream.setMaxKiloBytesPerSecond(64);

        long time = -System.currentTimeMillis();

        byte[] buffer = new byte[16384];

        for (int bytesRead = inputStream.read(buffer); bytesRead >= 0; bytesRead = inputStream
                .read(buffer)) {
            throttledOutputStream.write(buffer, 0, bytesRead);
        }
        throttledOutputStream.close();
        time += System.currentTimeMillis();

        System.out.println(time + " ms");
        System.out
                .println(((file.length() / 1024) / (time / 1000)) + " kb / s");
    }
}

Gruß Tom
 

Neue Beiträge

Zurück