FilterInputStream.java revision f5597e626ecf7949d249dea08c1a2964d890ec11
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. 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 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. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the non-null InputStream to filter reads on. 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected FilterInputStream(InputStream in) { 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.in = in; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of bytes that are available before this stream will 51f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * block. 52f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes available before blocking. 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs in this stream. 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int available() throws IOException { 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.available(); 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes this stream. This implementation closes the filtered stream. 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing this stream. 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.close(); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets a mark position in this stream. The parameter {@code readlimit} 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates how many bytes can be read before the mark is invalidated. 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sending {@code reset()} will reposition this stream back to the marked 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position, provided that {@code readlimit} has not been surpassed. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation sets a mark in the filtered stream. 80f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readlimit 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes that can be read from this stream before 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the mark is invalidated. 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void mark(int readlimit) { 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.mark(readlimit); 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this stream supports {@code mark()} and {@code reset()}. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation returns whether or not the filtered stream supports 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * marking. 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if {@code mark()} and {@code reset()} are supported, 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #skip(long) 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean markSupported() { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.markSupported(); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single byte from the filtered stream and returns it as an integer 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the range from 0 to 255. Returns -1 if the end of this stream has been 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte read or -1 if the end of the filtered stream has been 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the stream is closed or another IOException occurs. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.read(); 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads bytes from this stream and stores them in the byte array 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code buffer}. Returns the number of bytes actually read or -1 if no 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bytes were read and the end of this stream was encountered. This 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation reads bytes from the filtered stream. 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte array in which to store the read bytes. 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 IOException occurs. 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(byte[] buffer) throws IOException { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return read(buffer, 0, buffer.length); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads at most {@code count} bytes from this stream and stores them in the 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * byte array {@code buffer} starting at {@code offset}. Returns the number 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of bytes actually read or -1 if no bytes have been read and the end of 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this stream has been reached. This implementation reads bytes from the 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream. 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte array in which to store the bytes read. 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial position in {@code buffer} to store the bytes 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from this stream. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of bytes to store in {@code buffer}. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually read or -1 if the end of the 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream has been reached while reading. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is closed or another I/O error occurs. 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(byte[] buffer, int offset, int count) throws IOException { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.read(buffer, offset, count); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this stream to the last marked location. This implementation 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * resets the target stream. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is already closed, no mark has been set or the 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mark is no longer valid because more than {@code readlimit} 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bytes have been read since setting the mark. 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void reset() throws IOException { 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.reset(); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Skips {@code count} number of bytes in this stream. Subsequent 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code read()}'s will not return these bytes unless {@code reset()} is 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used. This implementation skips {@code count} number of bytes in the 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream. 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes to skip. 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually skipped. 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is closed or another IOException occurs. 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 193f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @see #reset() 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long skip(long count) throws IOException { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.skip(count); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 200