LineNumberInputStream.java revision 858dd42310622fd1b77bfa0fbd85ec851b3925c1
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 InputStream} and counts the line terminators 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * encountered while reading the data. Line numbering starts at 0. Recognized 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * line terminator sequences are {@code '\r'}, {@code '\n'} and {@code "\r\n"}. 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When using {@code read}, line terminator sequences are always translated into 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}. 26f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated Use {@link LineNumberReader} 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@Deprecated 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class LineNumberInputStream extends FilterInputStream { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int lineNumber; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int markedLineNumber = -1; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int lastChar = -1; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int markedLastChar; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code LineNumberInputStream} on the {@link InputStream} 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code in}. Line numbers are counted for all data read from this stream. 43f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 44858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * <p><strong>Warning:</strong> passing a null source creates an invalid 45858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * {@code LineNumberInputStream}. All operations on such a stream will fail. 46858dd42310622fd1b77bfa0fbd85ec851b3925c1Jesse Wilson * 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The non-null input stream to count line numbers. 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LineNumberInputStream(InputStream in) { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(in); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 55582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes * {@inheritDoc} 56582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes * 57582d926fbf5f5fd4800def67f86ecfedee44681eElliott Hughes * <p>Note that the source stream may just be a sequence of {@code "\r\n"} bytes 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which are converted into {@code '\n'} by this stream. Therefore, 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code available} returns only {@code in.available() / 2} bytes as 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * result. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int available() throws IOException { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.available() / 2 + (lastChar == -1 ? 0 : 1); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the current line number for this stream. Numbering starts at 0. 69f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current line number. 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getLineNumber() { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return lineNumber; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets a mark position in this stream. The parameter {@code readlimit} 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates how many bytes can be read before the mark is invalidated. 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sending {@code reset()} will reposition this stream back to the marked 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position, provided that {@code readlimit} has not been surpassed. 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The line number count will also be reset to the last marked 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * line number count. 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation sets a mark in the filtered stream. 85f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readlimit 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes that can be read from this stream before 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the mark is invalidated. 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void mark(int readlimit) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.mark(readlimit); 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markedLineNumber = lineNumber; 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markedLastChar = lastChar; 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single byte from the filtered stream and returns it as an integer 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the range from 0 to 255. Returns -1 if the end of this stream has been 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The line number count is incremented if a line terminator is encountered. 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "\r\n"}. Line terminator sequences are always translated into 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}. 108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte read or -1 if the end of the filtered stream has been 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the stream is closed or another IOException occurs. 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 114f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson @SuppressWarnings("fallthrough") 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int currentChar = lastChar; 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (currentChar == -1) { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentChar = in.read(); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastChar = -1; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (currentChar) { 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\r': 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentChar = '\n'; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastChar = in.read(); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastChar == '\n') { 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastChar = -1; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fall through 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\n': 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber++; 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentChar; 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads at most {@code length} bytes from the filtered stream and stores 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * them in the byte array {@code buffer} starting at {@code offset}. 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of bytes actually read or -1 if no bytes have been 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read and the end of this stream has been reached. 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The line number count is incremented if a line terminator is encountered. 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recognized line terminator sequences are {@code '\r'}, {@code '\n'} and 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "\r\n"}. Line terminator sequences are always translated into 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\n'}. 147f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array in which to store the bytes read. 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial position in {@code buffer} to store the bytes read 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from this stream. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of bytes to store in {@code buffer}. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually read or -1 if the end of the 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream has been reached while reading. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code offset < 0} or {@code length < 0}, or if 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code offset + length} is greater than the length of 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code buffer}. 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is closed or another IOException occurs. 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code buffer} is {@code null}. 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(byte[] buffer, int offset, int length) throws IOException { 1685839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson // Force buffer null check first! 1695839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson if (offset > buffer.length || offset < 0) { 170b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new ArrayIndexOutOfBoundsException("Offset out of bounds: " + offset); 171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes } 1725839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson if (length < 0 || length > buffer.length - offset) { 173b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new ArrayIndexOutOfBoundsException("Length out of bounds: " + length); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < length; i++) { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int currentChar; 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentChar = read(); 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (i != 0) { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (currentChar == -1) { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i == 0 ? -1 : i; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[offset + i] = (byte) currentChar; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return length; 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this stream to the last marked location. It also resets the line 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * count to what is was when this stream was marked. 197f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is already closed, no mark has been set or the 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mark is no longer valid because more than {@code readlimit} 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bytes have been read since setting the mark. 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #markSupported() 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset() throws IOException { 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.reset(); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lineNumber = markedLineNumber; 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastChar = markedLastChar; 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the line number of this stream to the specified 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code lineNumber}. Note that this may have side effects on the 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * line number associated with the last marked position. 216f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param lineNumber 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new lineNumber value. 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setLineNumber(int lineNumber) { 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.lineNumber = lineNumber; 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Skips {@code count} number of bytes in this stream. Subsequent 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code read()}'s will not return these bytes unless {@code reset()} is 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used. This implementation skips {@code count} number of bytes in the 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * filtered stream and increments the line number count whenever line 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * terminator sequences are skipped. 232f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes to skip. 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually skipped. 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is closed or another IOException occurs. 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #mark(int) 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #read() 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #reset() 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long skip(long count) throws IOException { 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count <= 0) { 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < count; i++) { 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int currentChar = read(); 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (currentChar == -1) { 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return count; 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 256