LineNumberReader.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
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 Project/** 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Wraps an existing {@link Reader} and counts the line terminators encountered 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * while reading the data. The line number starts at 0 and is incremented any 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * time {@code '\r'}, {@code '\n'} or {@code "\r\n"} is read. The class has an 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * internal buffer for its data. The size of the buffer defaults to 8 KB. 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class LineNumberReader extends BufferedReader { 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int lineNumber; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int markedLineNumber = -1; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean lastWasCR; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean markedLastWasCR; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new LineNumberReader on the Reader {@code in}. The internal 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer gets the default size (8 KB). 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the Reader that is buffered. 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LineNumberReader(Reader in) { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(in); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new LineNumberReader on the Reader {@code in}. The size of 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the internal buffer is specified by the parameter {@code size}. 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the Reader that is buffered. 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the size of the buffer to allocate. 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code size <= 0}. 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LineNumberReader(Reader in, int size) { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(in, size); 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the current line number for this reader. Numbering starts at 0. 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current line number. 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getLineNumber() { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return lineNumber; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 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 * Sending {@code reset()} will reposition this reader back to the marked 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position, provided that {@code readlimit} has not been surpassed. The 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * line number associated with this marked position is also stored so that 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it can be restored when {@code reset()} is called. 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readlimit 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of characters that can be read from this stream 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before the mark is invalidated. 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the mark in this reader. 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void mark(int readlimit) throws IOException { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.mark(readlimit); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markedLineNumber = lineNumber; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markedLastWasCR = lastWasCR; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single character from the source reader and returns it as an 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer with the two higher-order bytes set to 0. Returns -1 if the end 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the source reader has been reached. 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The line number count is incremented if a line terminator is encountered. 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "\r\n"}. Line terminator sequences are always translated into 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}. 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the character read or -1 if the end of the source reader has been 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the reader is closed or another IOException occurs. 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int ch = super.read(); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ch == '\n' && lastWasCR) { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ch = super.read(); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = false; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (ch) { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\r': 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ch = '\n'; 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = true; 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fall through 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\n': 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber++; 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ch; 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads at most {@code count} characters from the source reader and stores 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * them in the character array {@code buffer} starting at {@code offset}. 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of characters actually read or -1 if no characters 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have been read and the end of this reader has been reached. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The line number count is incremented if a line terminator is encountered. 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "\r\n"}. Line terminator sequences are always translated into 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}. 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array in which to store the characters read. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial position in {@code buffer} to store the characters 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from this reader. 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of characters to store in {@code buffer}. 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of characters actually read or -1 if the end of the 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * source reader has been reached while reading. 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed or another IOException occurs. 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(char[] buffer, int offset, int count) throws IOException { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int read = super.read(buffer, offset, count); 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (read == -1) { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < read; i++) { 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project char ch = buffer[offset + i]; 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ch == '\r') { 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber++; 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = true; 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (ch == '\n') { 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!lastWasCR) { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber++; 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = false; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = false; 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return read; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the next line of text available from this reader. A line is 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * represented by 0 or more characters followed by {@code '\r'}, 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}, {@code "\r\n"} or the end of the stream. The returned 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * string does not include the newline sequence. 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the contents of the line or {@code null} if no characters have 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * been read before the end of the stream has been reached. 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed or another IOException occurs. 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String readLine() throws IOException { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* Typical Line Length */ 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder result = new StringBuilder(80); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (true) { 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int character = read(); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (character == -1) { 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result.length() != 0 ? result.toString() : null; 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (character == '\n') { 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result.toString(); 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append((char) character); 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this reader to the last marked location. It also resets the line 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * count to what is was when this reader was marked. This implementation 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * resets the source reader. 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is already closed, no mark has been set or the 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mark is no longer valid because more than {@code readlimit} 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bytes have been read since setting the mark. 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset() throws IOException { 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.reset(); 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber = markedLineNumber; 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastWasCR = markedLastWasCR; 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 * Sets the line number of this reader to the specified {@code lineNumber}. 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that this may have side effects on the line number associated with 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the last marked position. 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param lineNumber 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new line number value. 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setLineNumber(int lineNumber) { 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.lineNumber = lineNumber; 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Skips {@code count} number of characters in this reader. Subsequent 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code read()}'s will not return these characters unless {@code reset()} 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is used. This implementation skips {@code count} number of characters in 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source reader and increments the line number count whenever line 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * terminator sequences are skipped. 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of characters to skip. 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of characters actually skipped. 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code count < 0}. 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this reader is closed or another IOException occurs. 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #read() 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long skip(long count) throws IOException { 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count < 0) { 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (lock) { 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < count; i++) { 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (read() == -1) { 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return count; 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 294