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     * @return the byte read or -1 if the end of stream has been reached.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the stream is closed or another IOException occurs.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int read() throws IOException;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
160eb8027492e81d5d3a0d1cd49494c59f9a03eeaa3Elliott Hughes     * Equivalent to {@code read(buffer, 0, buffer.length)}.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
162eb8027492e81d5d3a0d1cd49494c59f9a03eeaa3Elliott Hughes    public int read(byte[] buffer) throws IOException {
163eb8027492e81d5d3a0d1cd49494c59f9a03eeaa3Elliott Hughes        return read(buffer, 0, buffer.length);
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads at most {@code length} bytes from this stream and stores them in
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the byte array {@code b} starting at {@code offset}.
169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
17008a723cb3291b96a323478bd7d799192818cb0b1Jesse Wilson     * @param buffer
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte array in which to store the bytes read.
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initial position in {@code buffer} to store the bytes read
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            from this stream.
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of bytes to store in {@code b}.
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually read or -1 if the end of the stream
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         has been reached.
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code length < 0}, or if
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code offset + length} is greater than the length of
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code b}.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the stream is closed or another IOException occurs.
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
18608a723cb3291b96a323478bd7d799192818cb0b1Jesse Wilson    public int read(byte[] buffer, int offset, int length) throws IOException {
187b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkOffsetAndCount(buffer.length, offset, length);
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < length; i++) {
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int c;
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if ((c = read()) == -1) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return i == 0 ? -1 : i;
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i != 0) {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return i;
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
20008a723cb3291b96a323478bd7d799192818cb0b1Jesse Wilson            buffer[offset + i] = (byte) c;
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return length;
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets this stream to the last marked location. Throws an
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code IOException} if the number of bytes read since the mark has been
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * set is greater than the limit provided to {@code mark}, or if no mark
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * has been set.
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation always throws an {@code IOException} and concrete
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * subclasses should provide the proper implementation.
213f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this stream is closed or another IOException occurs.
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void reset() throws IOException {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IOException();
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
222582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * Skips at most {@code n} bytes in this stream. This method does nothing and returns
223f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * 0 if {@code n} is negative, but some subclasses may throw.
224582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
225582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>Note the "at most" in the description of this method: this method may choose to skip
226582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * fewer bytes than requested. Callers should <i>always</i> check the return value.
227582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     *
228582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes     * <p>This default implementation reads bytes into a temporary
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * buffer. Concrete subclasses should provide their own implementation.
230f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2313541c79d5058b86e742867b4ee5811a1de01de1fJesse Wilson     * @param byteCount the number of bytes to skip.
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually skipped.
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this stream is closed or another IOException occurs.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2363541c79d5058b86e742867b4ee5811a1de01de1fJesse Wilson    public long skip(long byteCount) throws IOException {
2373541c79d5058b86e742867b4ee5811a1de01de1fJesse Wilson        return Streams.skipByReading(this, byteCount);
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
240