1 package com.imcode.util; 2 3 import java.io.IOException; 4 import java.io.PushbackReader; 5 import java.io.Reader; 6 7 /*** 8 * A reader that doesn't eat newlines like BuffereReader does. 9 * 10 * @author kreiger 11 */ 12 public class LineReader { 13 14 private final PushbackReader reader ; 15 private final int expectedMaximumLineLength; 16 17 private int linesRead ; 18 19 public LineReader(Reader reader) { 20 this(reader, 96) ; 21 } 22 23 public LineReader(Reader reader, int expectedMaximumLineLength) { 24 this.reader = new PushbackReader(reader) ; 25 this.expectedMaximumLineLength = expectedMaximumLineLength; 26 } 27 28 public int getLinesRead() { 29 return linesRead; 30 } 31 32 public String readLine() throws IOException { 33 StringBuffer line = new StringBuffer(expectedMaximumLineLength); 34 for ( int c = reader.read(); -1 != c; c = reader.read() ) { 35 line.append( (char)c ); 36 if ( '\n' == c ) { 37 break; 38 } else if ( '\r' == c ) { 39 c = reader.read() ; 40 if ( '\n' == c ) { 41 line.append( (char)c ) ; 42 } else if ( -1 != c ) { 43 reader.unread(c); 44 } 45 break ; 46 } 47 } 48 if ( line.length() == 0 ) { 49 return null; 50 } 51 linesRead++ ; 52 return line.toString(); 53 } 54 55 }