151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.io; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A <code>FilterInputStream</code> contains 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * some other input stream, which it uses as 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * its basic source of data, possibly transforming 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the data along the way or providing additional 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * functionality. The class <code>FilterInputStream</code> 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * itself simply overrides all methods of 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>InputStream</code> with versions that 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * pass all requests to the contained input 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream. Subclasses of <code>FilterInputStream</code> 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * may further override some of these methods 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and may also provide additional methods 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and fields. 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Jonathan Payne 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.0 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass FilterInputStream extends InputStream { 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The input stream to be filtered. 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected volatile InputStream in; 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a <code>FilterInputStream</code> 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by assigning the argument <code>in</code> 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the field <code>this.in</code> so as 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to remember it for later use. 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param in the underlying input stream, or <code>null</code> if 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this instance is to be created without an underlying stream. 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected FilterInputStream(InputStream in) { 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.in = in; 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads the next byte of data from this input stream. The value 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * byte is returned as an <code>int</code> in the range 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>0</code> to <code>255</code>. If no byte is available 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * because the end of the stream has been reached, the value 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>-1</code> is returned. This method blocks until input data 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is available, the end of the stream is detected, or an exception 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is thrown. 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * simply performs <code>in.read()</code> and returns the result. 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the next byte of data, or <code>-1</code> if the end of the 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream is reached. 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error occurs. 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#in 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int read() throws IOException { 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return in.read(); 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads up to <code>byte.length</code> bytes of data from this 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * input stream into an array of bytes. This method blocks until some 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * input is available. 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method simply performs the call 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>read(b, 0, b.length)</code> and returns 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the result. It is important that it does 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <i>not</i> do <code>in.read(b)</code> instead; 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * certain subclasses of <code>FilterInputStream</code> 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * depend on the implementation strategy actually 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used. 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param b the buffer into which the data is read. 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the total number of bytes read into the buffer, or 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>-1</code> if there is no more data because the end of 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the stream has been reached. 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error occurs. 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#read(byte[], int, int) 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int read(byte b[]) throws IOException { 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return read(b, 0, b.length); 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads up to <code>len</code> bytes of data from this input stream 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * into an array of bytes. If <code>len</code> is not zero, the method 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * blocks until some input is available; otherwise, no 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * bytes are read and <code>0</code> is returned. 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method simply performs <code>in.read(b, off, len)</code> 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and returns the result. 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param b the buffer into which the data is read. 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param off the start offset in the destination array <code>b</code> 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param len the maximum number of bytes read. 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the total number of bytes read into the buffer, or 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>-1</code> if there is no more data because the end of 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the stream has been reached. 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NullPointerException If <code>b</code> is <code>null</code>. 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IndexOutOfBoundsException If <code>off</code> is negative, 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>len</code> is negative, or <code>len</code> is greater than 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>b.length - off</code> 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error occurs. 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#in 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int read(byte b[], int off, int len) throws IOException { 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return in.read(b, off, len); 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Skips over and discards <code>n</code> bytes of data from the 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * input stream. The <code>skip</code> method may, for a variety of 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * reasons, end up skipping over some smaller number of bytes, 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * possibly <code>0</code>. The actual number of bytes skipped is 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned. 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method simply performs <code>in.skip(n)</code>. 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param n the number of bytes to be skipped. 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the actual number of bytes skipped. 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if the stream does not support seek, 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or if some other I/O error occurs. 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public long skip(long n) throws IOException { 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return in.skip(n); 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an estimate of the number of bytes that can be read (or 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * skipped over) from this input stream without blocking by the next 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * caller of a method for this input stream. The next caller might be 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the same thread or another thread. A single read or skip of this 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * many bytes will not block, but may read or skip fewer bytes. 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method returns the result of {@link #in in}.available(). 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an estimate of the number of bytes that can be read (or skipped 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * over) from this input stream without blocking. 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error occurs. 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int available() throws IOException { 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return in.available(); 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Closes this input stream and releases any system resources 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * associated with the stream. 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method simply performs <code>in.close()</code>. 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error occurs. 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#in 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void close() throws IOException { 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski in.close(); 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Marks the current position in this input stream. A subsequent 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * call to the <code>reset</code> method repositions this stream at 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the last marked position so that subsequent reads re-read the same bytes. 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>readlimit</code> argument tells this input stream to 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * allow that many bytes to be read before the mark position gets 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invalidated. 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method simply performs <code>in.mark(readlimit)</code>. 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param readlimit the maximum limit of bytes that can be read before 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the mark position becomes invalid. 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#in 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#reset() 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized void mark(int readlimit) { 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski in.mark(readlimit); 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Repositions this stream to the position at the time the 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>mark</code> method was last called on this input stream. 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * simply performs <code>in.reset()</code>. 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Stream marks are intended to be used in 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * situations where you need to read ahead a little to see what's in 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the stream. Often this is most easily done by invoking some 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * general parser. If the stream is of the type handled by the 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parse, it just chugs along happily. If the stream is not of 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that type, the parser should toss an exception when it fails. 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this happens within readlimit bytes, it allows the outer 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * code to reset the stream and try another parser. 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if the stream has not been marked or if the 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mark has been invalidated. 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#in 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#mark(int) 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized void reset() throws IOException { 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski in.reset(); 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Tests if this input stream supports the <code>mark</code> 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and <code>reset</code> methods. 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * simply performs <code>in.markSupported()</code>. 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <code>true</code> if this stream type supports the 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>mark</code> and <code>reset</code> method; 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>false</code> otherwise. 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.FilterInputStream#in 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.InputStream#mark(int) 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.InputStream#reset() 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean markSupported() { 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return in.markSupported(); 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 246