SizeLimitInputStream.java
package gov.usgs.earthquake.util;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Stream that only allows a certain number of bytes to be read.
*
* Current implementation only tracks read bytes, and ignores any mark or reset
* calls.
*/
public class SizeLimitInputStream extends FilterInputStream {
/** Maximum number of bytes to read. */
private long limit;
/** Number of bytes already read. */
private long read = 0L;
/**
* Construct a new SizeLimitInputStream.
*
* @param in
* stream to limit.
* @param limit
* maximum number of bytes allowed to read.
*/
public SizeLimitInputStream(InputStream in, final long limit) {
super(in);
this.limit = limit;
}
/**
* Return number of bytes read.
* @return bytes read
*/
public long getRead() {
return this.read;
}
/**
* Read one byte.
*/
@Override
public int read() throws IOException {
int b = in.read();
if (b != -1) {
read++;
checkLimit();
}
return b;
}
/**
* Read into an array of bytes.
*/
@Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
/**
* Read into an array of bytes.
*/
@Override
public int read(byte[] b, int off, int len) throws IOException {
int total = in.read(b, off, len);
if (total != -1) {
read += total;
checkLimit();
}
return total;
}
/**
* Check how many bytes have been read.
*
* @throws IOException
* if more bytes than the limit allows have been read.
*/
protected void checkLimit() throws IOException {
if (limit > 0 && read > limit) {
throw new IOException("Read more than size limit (" + limit
+ ") bytes");
}
}
}