public class CountingInputStream extends PushbackInputStream {
private long bytesRead;
public CountingInputStream(InputStream is) {
super(is);
}
public CountingInputStream(InputStream is,int len) {
super(is,len);
}
public long getPosition() {
return bytesRead;
}
@Override
public void unread(byte[] b, int off, int len) throws IOException {
bytesRead -= len;
super.unread(b, off, len);
}
@Override
public void unread(int b) throws IOException {
bytesRead--;
super.unread(b);
}
@Override
public void unread(byte[] b) throws IOException {
bytesRead -= b.length;
super.unread(b);
}
@Override
public boolean markSupported() {
return false;
}
@Override
public synchronized void reset() throws IOException {
throw new IOException("Mark not supported");
}
@Override
public int read() throws IOException {
int rd = super.read();
if (rd != -1) {
bytesRead++;
}
return rd;
}
@Override
public int read(byte[] b) throws IOException {
int read = super.read(b);
if (read != -1) {
bytesRead += read;
}
return read;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int read = super.read(b, off, len);
if (read != -1) {
bytesRead += read;
}
return read;
}
@Override
public long skip(long n) throws IOException {
long skipped = super.skip(n);
bytesRead += skipped;
return skipped;
}
}
Monday, March 14, 2011
Counting bits
Here's a simple input stream which will tell you the current position. You should insert this after any buffered input streams if you want an accurate position after a read.
Wednesday, March 9, 2011
GZip pushback input stream
When dealing w/ Java's GZIPInputStream, it has an annoying habit of eating bits past the end of the gzip trailer. Normally when reading a file, this isn't a problem, but when reading concatenated GZIP'd files or gzip data embedded in other inputstreams, you would really like to have those overread bits back. Using this inputstream, you can.
public class GzipPushbackStream extends GZIPInputStream {
private boolean pushed = false;
private static final int TRAILER_LEN = 8; // 8 byte tailer
public GzipPushbackStream(PushbackInputStream pis) throws IOException {
super(pis);
}
@Override
public int read(byte[] buf, int off, int len) throws IOException {
int read = super.read(buf, off, len);
if (eos && !pushed) {
int n = inf.getRemaining();
if (n > TRAILER_LEN) {
int offset = super.len - (n -TRAILER_LEN);
((PushbackInputStream) in).unread(super.buf, offset, n - TRAILER_LEN);
}
pushed = true;
}
return read;
}
}
Subscribe to:
Comments (Atom)