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; 21b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A specialized {@link Reader} for reading the contents of a char array. 24f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see CharArrayWriter 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class CharArrayReader extends Reader { 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The buffer for characters. 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 31171dc20afe5071d5cbfad7103903bfa2c1f8d00fElliott Hughes protected char[] buf; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The current buffer position. 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int pos; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The current mark position. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int markedPos = -1; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ending index of the buffer. 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int count; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a CharArrayReader on the char array {@code buf}. The size of 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the reader is set to the length of the buffer and the object to to read 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from is set to {@code buf}. 52f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buf 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the char array from which to read. 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CharArrayReader(char[] buf) { 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.buf = buf; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.count = buf.length; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a CharArrayReader on the char array {@code buf}. The size of 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the reader is set to {@code length} and the start position from which to 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read the buffer is set to {@code offset}. 65f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buf 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the char array from which to read. 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the index of the first character in {@code buf} to read. 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of characters that can be read from {@code buf}. 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code offset < 0} or {@code length < 0}, or if 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code offset} is greater than the size of {@code buf} . 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CharArrayReader(char[] buf, int offset, int length) { 7755392539fea537abfb6581b474918f9d611fba27Jesse Wilson /* 7855392539fea537abfb6581b474918f9d611fba27Jesse Wilson * The spec of this constructor is broken. In defining the legal values 7955392539fea537abfb6581b474918f9d611fba27Jesse Wilson * of offset and length, it doesn't consider buffer's length. And to be 8055392539fea537abfb6581b474918f9d611fba27Jesse Wilson * compatible with the broken spec, we must also test whether 8155392539fea537abfb6581b474918f9d611fba27Jesse Wilson * (offset + length) overflows. 8255392539fea537abfb6581b474918f9d611fba27Jesse Wilson */ 8355392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (offset < 0 || offset > buf.length || length < 0 || offset + length < 0) { 8455392539fea537abfb6581b474918f9d611fba27Jesse Wilson throw new IllegalArgumentException(); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.buf = buf; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.pos = offset; 88f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson this.markedPos = offset; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* This is according to spec */ 9155392539fea537abfb6581b474918f9d611fba27Jesse Wilson int bufferLength = buf.length; 9255392539fea537abfb6581b474918f9d611fba27Jesse Wilson this.count = offset + length < bufferLength ? length : bufferLength; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method closes this CharArrayReader. Once it is closed, you can no 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * longer read from it. Only the first invocation of this method has any 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * effect. 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isOpen()) { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf = null; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this reader is open. 111f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the reader is open, {@code false} otherwise. 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isOpen() { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buf != null; 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this reader is closed. 120f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the reader is closed, {@code false} otherwise. 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isClosed() { 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buf == null; 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets a mark position in this reader. The parameter {@code readLimit} is 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ignored for CharArrayReaders. Calling {@code reset()} will reposition the 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reader back to the marked position provided the mark has not been 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invalidated. 132f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readLimit 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ignored for CharArrayReaders. 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed. 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void mark(int readLimit) throws IOException { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 141b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotClosed(); 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markedPos = pos; 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes private void checkNotClosed() throws IOException { 147b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes if (isClosed()) { 148b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new IOException("CharArrayReader is closed"); 149b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes } 150b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes } 151b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this reader supports the {@code mark()} and 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code reset()} methods. 155f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} for CharArrayReader. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean markSupported() { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single character from this reader and returns it as an integer 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the two higher-order bytes set to 0. Returns -1 if no more 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters are available from this reader. 169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the character read as an int or -1 if the end of the reader has 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * been reached. 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed. 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 178b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotClosed(); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (pos == count) { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buf[pos++]; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads at most {@code count} characters from this CharArrayReader and 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stores them at {@code offset} in the character array {@code buf}. 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of characters actually read or -1 if the end of reader 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * was encountered. 191f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the character array to store the characters read. 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial position in {@code buffer} to store the characters 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from this reader. 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param len 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of characters to read. 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return number of characters read or -1 if the end of the reader has been 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code offset < 0} or {@code len < 0}, or if 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code offset + len} is bigger than the size of 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code buffer}. 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed. 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(char[] buffer, int offset, int len) throws IOException { 210b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes Arrays.checkOffsetAndCount(buffer.length, offset, len); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 212b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotClosed(); 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (pos < this.count) { 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int bytesRead = pos + len > this.count ? this.count - pos : len; 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(this.buf, pos, buffer, offset, bytesRead); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pos += bytesRead; 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return bytesRead; 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this reader is ready to be read without blocking. 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns {@code true} if the next {@code read} will not block. Returns 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if this reader may or may not block when {@code read} is 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * called. The implementation in CharArrayReader always returns {@code true} 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * even when it has been closed. 229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this reader will not block when {@code read} is 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * called, {@code false} if unknown or blocking will occur. 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed. 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean ready() throws IOException { 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 238b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotClosed(); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return pos != count; 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this reader's position to the last {@code mark()} location. 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Invocations of {@code read()} and {@code skip()} will occur from this new 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * location. If this reader has not been marked, it is reset to the 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * beginning of the string. 248f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed. 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset() throws IOException { 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 255b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotClosed(); 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pos = markedPos != -1 ? markedPos : 0; 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 261f9480f317cddcec859025833b748f096247a40aaElliott Hughes * Skips {@code charCount} characters in this reader. Subsequent calls to 262f9480f317cddcec859025833b748f096247a40aaElliott Hughes * {@code read} will not return these characters unless {@code reset} 263f9480f317cddcec859025833b748f096247a40aaElliott Hughes * is used. This method does nothing and returns 0 if {@code charCount <= 0}. 264f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of characters actually skipped. 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed. 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 270f9480f317cddcec859025833b748f096247a40aaElliott Hughes public long skip(long charCount) throws IOException { 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 272b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotClosed(); 273f9480f317cddcec859025833b748f096247a40aaElliott Hughes if (charCount <= 0) { 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long skipped = 0; 277f9480f317cddcec859025833b748f096247a40aaElliott Hughes if (charCount < this.count - pos) { 278f9480f317cddcec859025833b748f096247a40aaElliott Hughes pos = pos + (int) charCount; 279f9480f317cddcec859025833b748f096247a40aaElliott Hughes skipped = charCount; 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project skipped = this.count - pos; 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pos = this.count; 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return skipped; 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 288