/**
*
*/
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");
}
}