/** * */ package at.gv.egiz.pdfas.impl.input; import java.io.IOException; import java.io.InputStream; /** * An input stream that has a delimited length. * * @author wprinz */ public class DelimitedInputStream extends InputStream { /** * The underlying InputStream. */ protected InputStream is = null; /** * The number of bytes that can be read from the stream. */ protected int bytes_to_read = -1; /** * Constructs the DelimitedInputStream from which a maximum of length bytes * can be read. */ public DelimitedInputStream(InputStream is, int length) { this.is = is; this.bytes_to_read = length; } /** * @see java.io.InputStream#read() */ public int read() throws IOException { if (this.bytes_to_read <= 0) { return -1; } int read = this.is.read(); if (read > 0) { this.bytes_to_read--; } return read; } /** * @see java.io.InputStream#read(byte[], int, int) */ public int read(byte[] b, int off, int len) throws IOException { int btr = Math.min(len, this.bytes_to_read); int read = this.is.read(b, off, btr); if (read > 0) { this.bytes_to_read -= read; } return read; } /** * @see java.io.InputStream#read(byte[]) */ public int read(byte[] b) throws IOException { return read(b, 0, b.length); } /** * @see java.io.InputStream#skip(long) */ public long skip(long n) throws IOException { long bts = Math.min(n, this.bytes_to_read); long skipped = this.is.skip(bts); if (skipped > 0) { this.bytes_to_read -= skipped; } return skipped; } /** * @see java.io.InputStream#close() */ public void close() throws IOException { this.is.close(); } /** * @see java.io.InputStream#available() */ public int available() throws IOException { int avail = this.is.available(); return Math.min(this.bytes_to_read, avail); } }