| package aQute.lib.io; |
| |
| import java.io.*; |
| |
| public class LimitedInputStream extends InputStream { |
| |
| final InputStream in; |
| final int size; |
| int left; |
| |
| public LimitedInputStream(InputStream in, int size) { |
| this.in = in; |
| this.left = size; |
| this.size = size; |
| } |
| |
| @Override |
| public int read() throws IOException { |
| if (left <= 0) { |
| eof(); |
| return -1; |
| } |
| |
| left--; |
| return in.read(); |
| } |
| |
| @Override |
| public int available() throws IOException { |
| return Math.min(left, in.available()); |
| } |
| |
| @Override |
| public void close() throws IOException { |
| eof(); |
| in.close(); |
| } |
| |
| protected void eof() {} |
| |
| @Override |
| public synchronized void mark(int readlimit) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public boolean markSupported() { |
| return false; |
| } |
| |
| @Override |
| public int read(byte[] b, int off, int len) throws IOException { |
| int min = Math.min(len, left); |
| if (min == 0) |
| return 0; |
| |
| int read = in.read(b, off, min); |
| if (read > 0) |
| left -= read; |
| return read; |
| } |
| |
| @Override |
| public int read(byte[] b) throws IOException { |
| return read(b, 0, b.length); |
| } |
| |
| @Override |
| public synchronized void reset() throws IOException { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public long skip(long n) throws IOException { |
| long count = 0; |
| byte buffer[] = new byte[1024]; |
| while (n > 0 && read() >= 0) { |
| int size = read(buffer); |
| if (size <= 0) |
| return count; |
| count += size; |
| n -= size; |
| } |
| return count; |
| } |
| } |