# Download von FTP Server mit maximal Geschwindigkeit



## Schandro (3. Dez 2009)

Hi,

ich suche eine Möglichkeit eine Datei von einem FTP Server herunterzuladen, aber mit einer vom User eingestellten Maximal Geschwindigkeit (z.b. maximal 50 kb/s). Gibt es dafür bereits was fertiges oder muss ich das selber coden? Zurzeit benutze ich die apache commons.net library um mich mit dem FTP-Server zu verbinden, ich könnte aber auch ohne großen Umstand auf eine andere library umsteigen.


----------



## HoaX (3. Dez 2009)

Ich kenn die Lib nicht die du verwendest, aber wenn du eine Datei herunterlädst, kannst du einen Outputstream angeben wo du die Datei speichern willst? Wenn ja, dann kannst du an dieser Stelle eine entsprechende Verzögerung einbauen. Sollte relativ leicht gehen.


----------



## Gelöschtes Mitglied 5909 (5. Dez 2009)

hatte da mal was gebastelt, ist aber schon ne weile her. Eingesetzt habe ich es bisher auch nicht, 
aber es funktioniert denk ich ganz gut:


```
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class LimitedOutputStream extends FilterOutputStream {

    protected int  bps   = Integer.MAX_VALUE;

    protected long t0    = -1;

    protected long bytes = 0;

    protected int  rate  = Integer.MAX_VALUE;

    protected int  slept = 1;

    public LimitedOutputStream( OutputStream out, int bps ) {
        super(out);
        this.bps = bps;
    }

    public LimitedOutputStream( OutputStream out ) {
        this(out, Integer.MAX_VALUE);
    }

    @Override
    public void write( int b ) throws IOException {
        if ( bps == Integer.MAX_VALUE ) {
            super.write(b);
            return;
        }
        if ( t0 == -1 ) {
            t0 = System.currentTimeMillis();
            try {
                Thread.sleep(1000);
            } catch ( InterruptedException e ) {
            }
        }
        if ( rate >= bps ) {
            try {
                Thread.sleep(200 * slept);
                slept += 2;
            } catch ( InterruptedException e ) {
            }
        }
        else if ( slept > 0 ) {
            slept--;
        }
        super.write(b);
        bytes++;
        rate = calculateRate(t0, System.currentTimeMillis(), bytes);
    }

    public int getRate() {
        return rate;
    }

    public void setBps( int bps ) {
        this.bps = bps;
    }

    private static int calculateRate( long start, long end, long sent ) {
        try {
            return (int) (sent / ((end - start) / 1000));
        } catch ( ArithmeticException e ) {
            return 0;
        }
    }

}
```



```
import java.io.IOException;

public class Main {

    public static void main( String[] args ) throws IOException {
        LimitedOutputStream out = new LimitedOutputStream(System.out, 10);
        for ( int i = 0; i < 100000; i++ ) {
            out.write(32);
            System.out.println(out.getRate() + "b/s");
            if ( i == 100 ) {
                System.out.println("RATE Änderung");
                out.setBps(1024);
            }
        }
    }

}
```


----------

