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