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;
}
}
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.