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 Reader} and performs some transformation on the 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 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 reader. Readers that wrap another reader and 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provide some additional functionality on top of it usually inherit from this 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class. 27f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see FilterWriter 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class FilterReader extends Reader { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The target Reader which is being filtered. 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Reader in; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new FilterReader on the Reader {@code in}. 39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The non-null Reader to filter reads on. 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected FilterReader(Reader in) { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(in); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.in = in; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes this reader. This implementation closes the filtered reader. 50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing this reader. 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.close(); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets a mark position in this reader. The parameter {@code readlimit} 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates how many bytes can be read before the mark is invalidated. 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sending {@code reset()} will reposition this reader back to the marked 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position, provided that {@code readlimit} has not been surpassed. 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation sets a mark in the filtered reader. 68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readlimit 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes that can be read from this reader before 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the mark is invalidated. 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while marking this reader. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void mark(int readlimit) throws IOException { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.mark(readlimit); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this reader supports {@code mark()} and {@code reset()}. 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation returns whether the filtered reader supports marking. 87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if {@code mark()} and {@code reset()} are supported 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the filtered reader, {@code false} otherwise. 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #skip(long) 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean markSupported() { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.markSupported(); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single character from the filtered reader and returns it as an 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer with the two higher-order bytes set to 0. Returns -1 if the end 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the filtered reader has been reached. 105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The character read or -1 if the end of the filtered reader has 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * been reached. 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from this reader. 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 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 /** 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads at most {@code count} characters from the filtered reader and stores them 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the byte array {@code buffer} starting at {@code offset}. Returns the 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of characters actually read or -1 if no characters were read and 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the end of the filtered reader was encountered. 123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the char array in which to store the characters read. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial position in {@code buffer} to store the characters 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from this reader. 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of characters to store in {@code buffer}. 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of characters actually read or -1 if the end of the 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered reader has been reached while reading. 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from this reader. 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(char[] buffer, int offset, int count) throws IOException { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.read(buffer, offset, count); 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this reader is ready to be read without blocking. If 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the result is {@code true}, the next {@code read()} will not block. If 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the result is {@code false}, this reader may or may not block when 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code read()} is sent. 148f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this reader will not block when {@code read()} 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is called, {@code false} if unknown or blocking will occur. 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the reader is closed or some other I/O error occurs. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean ready() throws IOException { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.ready(); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this reader's position to the last marked location. Invocations of 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code read()} and {@code skip()} will occur from this new location. If 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this reader was not marked, the behavior depends on the implementation of 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code reset()} in the Reader subclass that is filtered by this reader. 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The default behavior for Reader is to throw an {@code IOException}. 167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred or the filtered reader does not support 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code mark()} and {@code reset()}. 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset() throws IOException { 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.reset(); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 182f9480f317cddcec859025833b748f096247a40aaElliott Hughes * Skips {@code charCount} characters in this reader. Subsequent calls to {@code read} 183f9480f317cddcec859025833b748f096247a40aaElliott Hughes * will not return these characters unless {@code reset} is used. The 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default implementation is to skip characters in the filtered reader. 185f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of characters actually skipped. 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the filtered reader is closed or some other I/O error 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * occurs. 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 195f9480f317cddcec859025833b748f096247a40aaElliott Hughes public long skip(long charCount) throws IOException { 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 197f9480f317cddcec859025833b748f096247a40aaElliott Hughes return in.skip(charCount); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 201