1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Wraps an existing {@link InputStream} and performs some transformation on 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the input data while it is being read. Transformations can be anything from a 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * simple byte-wise filtering input data to an on-the-fly compression or 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * decompression of the underlying stream. Input streams that wrap another input 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream and provide some additional functionality on top of it usually inherit 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from this class. 27f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see FilterOutputStream 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class FilterInputStream extends InputStream { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The source input stream that is filtered. 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected volatile InputStream in; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code FilterInputStream} with the specified input 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream as source. 40f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 41858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * <p><strong>Warning:</strong> passing a null source creates an invalid 42858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * {@code FilterInputStream}, that fails on every method that is not 43858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * overridden. Subclasses should check for null in their constructors. 44858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * 45858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * @param in the input stream to filter reads on. 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected FilterInputStream(InputStream in) { 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.in = in; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int available() throws IOException { 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.available(); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes this stream. This implementation closes the filtered stream. 58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing this stream. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.close(); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets a mark position in this stream. The parameter {@code readlimit} 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates how many bytes can be read before the mark is invalidated. 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sending {@code reset()} will reposition this stream back to the marked 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position, provided that {@code readlimit} has not been surpassed. 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation sets a mark in the filtered stream. 74f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readlimit 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes that can be read from this stream before 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the mark is invalidated. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void mark(int readlimit) { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.mark(readlimit); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this stream supports {@code mark()} and {@code reset()}. 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation returns whether or not the filtered stream supports 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * marking. 90f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if {@code mark()} and {@code reset()} are supported, 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #skip(long) 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean markSupported() { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.markSupported(); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single byte from the filtered stream and returns it as an integer 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the range from 0 to 255. Returns -1 if the end of this stream has been 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte read or -1 if the end of the filtered stream has been 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the stream is closed or another IOException occurs. 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.read(); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads at most {@code count} bytes from this stream and stores them in the 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * byte array {@code buffer} starting at {@code offset}. Returns the number 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of bytes actually read or -1 if no bytes have been read and the end of 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this stream has been reached. This implementation reads bytes from the 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream. 123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte array in which to store the bytes read. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial position in {@code buffer} to store the bytes 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from this stream. 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of bytes to store in {@code buffer}. 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually read or -1 if the end of the 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream has been reached while reading. 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is closed or another I/O error occurs. 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(byte[] buffer, int offset, int count) throws IOException { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.read(buffer, offset, count); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this stream to the last marked location. This implementation 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * resets the target stream. 144f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is already closed, no mark has been set or the 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mark is no longer valid because more than {@code readlimit} 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bytes have been read since setting the mark. 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void reset() throws IOException { 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.reset(); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 15810de12115591b8fa0c3814aac8a3df7b51ffa8bbElliott Hughes * Skips {@code byteCount} bytes in this stream. Subsequent 15910de12115591b8fa0c3814aac8a3df7b51ffa8bbElliott Hughes * calls to {@code read} will not return these bytes unless {@code reset} is 16010de12115591b8fa0c3814aac8a3df7b51ffa8bbElliott Hughes * used. This implementation skips {@code byteCount} bytes in the 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream. 162f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually skipped. 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is closed or another IOException occurs. 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 167f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @see #reset() 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 17080b486724ca19b3c1c3c36334d06856330362f83Jesse Wilson public long skip(long byteCount) throws IOException { 17180b486724ca19b3c1c3c36334d06856330362f83Jesse Wilson return in.skip(byteCount); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 174