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