1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.CharBuffer;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ReadOnlyBufferException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The base class for all readers. A reader is a means of reading data from a
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * source in a character-wise manner. Some readers also support marking a
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position in the input and returning to this position later.
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This abstract class does not provide a fully working implementation, so it
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * needs to be subclassed, and at least the {@link #read(char[], int, int)} and
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #close()} methods needs to be overridden. Overriding some of the
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * non-abstract methods is also often advised, since it might result in higher
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * efficiency.
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Many specialized readers for purposes like reading from a file already exist
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in this package.
36f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Writer
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Reader implements Readable, Closeable {
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The object used to synchronize access to the reader.
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Object lock;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Reader} with {@code this} as the object used to
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * synchronize critical sections.
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Reader() {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock = this;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Reader} with {@code lock} used to synchronize
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * critical sections.
56f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param lock
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object} used to synchronize critical sections.
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code lock} is {@code null}.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Reader(Object lock) {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (lock == null) {
6486acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("lock == null");
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.lock = lock;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this reader. Implementations of this method should free any
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * resources associated with the reader.
72f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing this reader.
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void close() throws IOException;
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets a mark position in this reader. The parameter {@code readLimit}
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicates how many characters can be read before the mark is invalidated.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Calling {@code reset()} will reposition the reader back to the marked
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * position if {@code readLimit} has not been surpassed.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This default implementation simply throws an {@code IOException};
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * subclasses must provide their own implementation.
86f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param readLimit
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of characters that can be read before the mark is
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            invalidated.
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code readLimit < 0}.
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting a mark in this reader.
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void mark(int readLimit) throws IOException {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IOException();
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader supports the {@code mark()} and
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code reset()} methods. This default implementation returns
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code false}.
105f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return always {@code false}.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean markSupported() {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads a single character from this reader and returns it as an integer
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with the two higher-order bytes set to 0. Returns -1 if the end of the
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reader has been reached.
116f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the character read or -1 if the end of the reader has been
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         reached.
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed or some other I/O error occurs.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read() throws IOException {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
124171dc20afe5071d5cbfad7103903bfa2c1f8d00fElliott Hughes            char[] charArray = new char[1];
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (read(charArray, 0, 1) != -1) {
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return charArray[0];
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads characters from this reader and stores them in the character array
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code buf} starting at offset 0. Returns the number of characters
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * actually read or -1 if the end of the reader has been reached.
136f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            character array to store the characters read.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters read or -1 if the end of the reader has
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         been reached.
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed or some other I/O error occurs.
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read(char[] buf) throws IOException {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return read(buf, 0, buf.length);
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads at most {@code count} characters from this reader and stores them
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * at {@code offset} in the character array {@code buf}. Returns the number
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of characters actually read or -1 if the end of the reader has been
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reached.
153f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the character array to store the characters read.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initial position in {@code buffer} to store the characters
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            read from this reader.
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of characters to read.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters read or -1 if the end of the reader has
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         been reached.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed or some other I/O error occurs.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
166fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes    public abstract int read(char[] buf, int offset, int count) throws IOException;
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader is ready to be read without blocking.
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns {@code true} if this reader will not block when {@code read} is
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * called, {@code false} if unknown or blocking will occur. This default
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation always returns {@code false}.
173f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return always {@code false}.
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed or some other I/O error occurs.
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #read()
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #read(char[])
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #read(char[], int, int)
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean ready() throws IOException {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets this reader's position to the last {@code mark()} location.
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Invocations of {@code read()} and {@code skip()} will occur from this new
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * location. If this reader has not been marked, the behavior of
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code reset()} is implementation specific. This default
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation throws an {@code IOException}.
191f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             always thrown in this default implementation.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void reset() throws IOException {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IOException();
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
202f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * Skips {@code charCount} characters in this reader. Subsequent calls of
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code read} methods will not return these characters unless {@code
204f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * reset} is used. This method may perform multiple reads to read {@code
205f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * charCount} characters.
206f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters actually skipped.
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
209f9480f317cddcec859025833b748f096247a40aaElliott Hughes     *             if {@code charCount < 0}.
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this reader is closed or some other I/O error occurs.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
216f9480f317cddcec859025833b748f096247a40aaElliott Hughes    public long skip(long charCount) throws IOException {
217f9480f317cddcec859025833b748f096247a40aaElliott Hughes        if (charCount < 0) {
218a1603838fe9e865575c87982e32c6343740e464cElliott Hughes            throw new IllegalArgumentException("charCount < 0: " + charCount);
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long skipped = 0;
222f9480f317cddcec859025833b748f096247a40aaElliott Hughes            int toRead = charCount < 512 ? (int) charCount : 512;
223171dc20afe5071d5cbfad7103903bfa2c1f8d00fElliott Hughes            char[] charsSkipped = new char[toRead];
224f9480f317cddcec859025833b748f096247a40aaElliott Hughes            while (skipped < charCount) {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int read = read(charsSkipped, 0, toRead);
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (read == -1) {
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return skipped;
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                skipped += read;
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (read < toRead) {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return skipped;
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
233f9480f317cddcec859025833b748f096247a40aaElliott Hughes                if (charCount - skipped < toRead) {
234f9480f317cddcec859025833b748f096247a40aaElliott Hughes                    toRead = (int) (charCount - skipped);
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return skipped;
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads characters and puts them into the {@code target} character buffer.
243f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param target
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the destination character buffer.
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters put into {@code target} or -1 if the end
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         of this reader has been reached before a character has been read.
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if any I/O error occurs while reading from this reader.
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code target} is {@code null}.
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ReadOnlyBufferException
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code target} is read-only.
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read(CharBuffer target) throws IOException {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = target.length();
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char[] buf = new char[length];
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        length = Math.min(length, read(buf));
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length > 0) {
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            target.put(buf, 0, length);
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return length;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
265