001 /*
002 * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
003 *
004 * http://uio.imagero.com
005 *
006 * Redistribution and use in source and binary forms, with or without
007 * modification, are permitted provided that the following conditions are met:
008 *
009 * o Redistributions of source code must retain the above copyright notice,
010 * this list of conditions and the following disclaimer.
011 *
012 * o Redistributions in binary form must reproduce the above copyright notice,
013 * this list of conditions and the following disclaimer in the documentation
014 * and/or other materials provided with the distribution.
015 *
016 * o Neither the name of Andrey Kuznetsov nor the names of
017 * its contributors may be used to endorse or promote products derived
018 * from this software without specific prior written permission.
019 *
020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
021 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
022 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
023 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
024 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
026 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
027 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
028 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
029 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
030 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
031 */
032
033 package com.imagero.uio.io;
034
035 import java.io.FilterInputStream;
036 import java.io.IOException;
037 import java.io.InputStream;
038
039 /**
040 * InputStream that reads specified number of bytes
041 *
042 * @author Kouznetsov Andrei
043 */
044 public class LimitedInputStream extends FilterInputStream {
045 protected int limit;
046
047 /**
048 * create new LimitedInputStream
049 *
050 * @param in InputStream
051 * @param limit read limit
052 */
053 public LimitedInputStream(InputStream in, int limit) {
054 super(in);
055 this.limit = limit;
056 }
057
058 public int available() throws IOException {
059 return limit;
060 }
061
062 public int read() throws IOException {
063 if(limit-- <= 0) {
064 return -1;
065 }
066 return in.read();
067 }
068
069 public int read(byte b[]) throws IOException {
070 return in.read(b, 0, b.length);
071 }
072
073 public int read(byte b[], int off, int len) throws IOException {
074 if(limit > 0) {
075 int length = Math.min(len, limit);
076 int res = in.read(b, off, length);
077 if(res > 0) {
078 limit -= res;
079 }
080 return res;
081 }
082 return -1;
083 }
084
085 public long skip(long n) throws IOException {
086 if(limit > 0) {
087 long length = Math.min(n, limit);
088 long res = in.skip(length);
089 if(res > 0) {
090 limit -= res;
091 }
092 return res;
093 }
094 return -1;
095 }
096
097 int mark;
098
099 public synchronized void mark(int readlimit) {
100 in.mark(readlimit);
101 mark = limit;
102 }
103
104 public synchronized void reset() throws IOException {
105 in.reset();
106 limit = mark;
107 }
108 }