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
20b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughesimport java.util.Arrays;
216186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.io.Streams;
223541c79d5058b86e742867b4ee5811a1de01de1fJesse Wilson
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * A readable source of bytes.
25ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson *
26ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * <p>Most clients will use input streams that read data from the file system
27ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * ({@link FileInputStream}), the network ({@link java.net.Socket#getInputStream()}/{@link
28ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * java.net.HttpURLConnection#getInputStream()}), or from an in-memory byte
29ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * array ({@link ByteArrayInputStream}).
30ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson *
31ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * <p>Use {@link InputStreamReader} to adapt a byte stream like this one into a
32ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * character stream.
33ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson *
34ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * <p>Most clients should wrap their input stream with {@link
35ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * BufferedInputStream}. Callers that do only bulk reads may omit buffering.
36ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson *
37ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * <p>Some implementations support marking a position in the input stream and
38ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * resetting back to this position later. Implementations that don't return
39ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * false from {@link #markSupported()} and throw an {@link IOException} when
40ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * {@link #reset()} is called.
41ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson *
42ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * <h3>Subclassing InputStream</h3>
43ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * Subclasses that decorate another input stream should consider subclassing
44ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * {@link FilterInputStream}, which delegates all calls to the source input
45ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * stream.
46ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson *
47ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * <p>All input stream subclasses should override <strong>both</strong> {@link
48ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * #read() read()} and {@link #read(byte[],int,int) read(byte[],int,int)}. The
49ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * three argument overload is necessary for bulk access to the data. This is
50ed79eabe3c220b66c07743ba6495c342a4b3eaf7Jesse Wilson * much more efficient than byte-by-byte access.
51f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see OutputStream
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class InputStream extends Object implements Closeable {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This constructor does nothing. It is provided for signature
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * compatibility.
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InputStream() {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* empty */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
65582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * Returns an estimated number of bytes that can be read or skipped without blocking for more
66582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * input.
67f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
68582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>Note that this method provides such a weak guarantee that it is not very useful in
69582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * practice.
70582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
71582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>Firstly, the guarantee is "without blocking for more input" rather than "without
72582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * blocking": a read may still block waiting for I/O to complete&nbsp;&mdash; the guarantee is
73582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * merely that it won't have to wait indefinitely for data to be written. The result of this
74582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * method should not be used as a license to do I/O on a thread that shouldn't be blocked.
75582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
76582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>Secondly, the result is a
77582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * conservative estimate and may be significantly smaller than the actual number of bytes
78582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * available. In particular, an implementation that always returns 0 would be correct.
79582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * In general, callers should only use this method if they'd be satisfied with
80582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * treating the result as a boolean yes or no answer to the question "is there definitely
81582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * data ready?".
82582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
83582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>Thirdly, the fact that a given number of bytes is "available" does not guarantee that a
84582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * read or skip will actually read or skip that many bytes: they may read or skip fewer.
85582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
86582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>It is particularly important to realize that you <i>must not</i> use this method to
87582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * size a container and assume that you can read the entirety of the stream without needing
88582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * to resize the container. Such callers should probably write everything they read to a
89582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * {@link ByteArrayOutputStream} and convert that to a byte array. Alternatively, if you're
90582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * reading from a file, {@link File#length} returns the current length of the file (though
91582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * assuming the file's length can't change may be incorrect, reading a file is inherently
92582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * racy).
93582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
94582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>The default implementation of this method in {@code InputStream} always returns 0.
95582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * Subclasses should override this method if they are able to indicate the number of bytes
96582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * available.
97582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
98582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * @return the estimated number of bytes available
99582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * @throws IOException if this stream is closed or an error occurs
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int available() throws IOException {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return 0;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this stream. Concrete implementations of this class should free
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * any resources during close. This implementation does nothing.
108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing this stream.
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() throws IOException {
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* empty */
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets a mark position in this InputStream. The parameter {@code readlimit}
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicates how many bytes can be read before the mark is invalidated.
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sending {@code reset()} will reposition the stream back to the marked
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * position provided {@code readLimit} has not been surpassed.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This default implementation does nothing and concrete subclasses must
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * provide their own implementation.
124f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param readlimit
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bytes that can be read from this stream before
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the mark is invalidated.
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void mark(int readlimit) {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* empty */
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this stream supports the {@code mark()} and
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code reset()} methods. The default implementation returns {@code false}.
138f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return always {@code false}.
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean markSupported() {
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads a single byte from this stream and returns it as an integer in the
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * range from 0 to 255. Returns -1 if the end of the stream has been
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reached. Blocks until one byte has been read, the end of the source
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stream is detected or an exception is thrown.
152f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the stream is closed or another IOException occurs.
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int read() throws IOException;
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
159eb8027492e81d5d3a0d1cd49494c59f9a03eeaa3Elliott Hughes     * Equivalent to {@code read(buffer, 0, buffer.length)}.
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
161eb8027492e81d5d3a0d1cd49494c59f9a03eeaa3Elliott Hughes    public int read(byte[] buffer) throws IOException {
162eb8027492e81d5d3a0d1cd49494c59f9a03eeaa3Elliott Hughes        return read(buffer, 0, buffer.length);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
166325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes     * Reads up to {@code byteCount} bytes from this stream and stores them in
167325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes     * the byte array {@code buffer} starting at {@code byteOffset}.
168325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes     * Returns the number of bytes actually read or -1 if the end of the stream
169325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes     * has been reached.
170f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
172325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes     *   if {@code byteOffset < 0 || byteCount < 0 || byteOffset + byteCount > buffer.length}.
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the stream is closed or another IOException occurs.
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
176325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes    public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
177325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes        Arrays.checkOffsetAndCount(buffer.length, byteOffset, byteCount);
178325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes        for (int i = 0; i < byteCount; ++i) {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int c;
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if ((c = read()) == -1) {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return i == 0 ? -1 : i;
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i != 0) {
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return i;
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
190325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes            buffer[byteOffset + i] = (byte) c;
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
192325ff8c68ed5e530e9e1d487b9e2e6d8f8e2bd37Elliott Hughes        return byteCount;
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets this stream to the last marked location. Throws an
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code IOException} if the number of bytes read since the mark has been
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * set is greater than the limit provided to {@code mark}, or if no mark
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * has been set.
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation always throws an {@code IOException} and concrete
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * subclasses should provide the proper implementation.
203f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this stream is closed or another IOException occurs.
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void reset() throws IOException {
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IOException();
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
212e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * Skips at most {@code byteCount} bytes in this stream. The number of actual
213e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * bytes skipped may be anywhere between 0 and {@code byteCount}. If
214e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * {@code byteCount} is negative, this method does nothing and returns 0, but
215e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * some subclasses may throw.
216582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
217e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * <p>Note the "at most" in the description of this method: this method may
218e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * choose to skip fewer bytes than requested. Callers should <i>always</i>
219e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * check the return value.
220582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
221e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * <p>This default implementation reads bytes into a temporary buffer. Concrete
222e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * subclasses should provide their own implementation.
223f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually skipped.
225e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     * @throws IOException if this stream is closed or another IOException
226e7dc52f0cbb61a61b9908a9b1e7b58a34e12a06cKenny Root     *             occurs.
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2283541c79d5058b86e742867b4ee5811a1de01de1fJesse Wilson    public long skip(long byteCount) throws IOException {
2293541c79d5058b86e742867b4ee5811a1de01de1fJesse Wilson        return Streams.skipByReading(this, byteCount);
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
232