LineNumberReaderpublic class LineNumberReader extends BufferedReader A buffered character-input stream that keeps track of line numbers. This
class defines methods {@link #setLineNumber(int)} and {@link
#getLineNumber()} for setting and getting the current line number
respectively.
By default, line numbering begins at 0. This number increments at every
line terminator as the data is read, and can be changed
with a call to setLineNumber(int). Note however, that
setLineNumber(int) does not actually change the current position in
the stream; it only changes the value that will be returned by
getLineNumber().
A line is considered to be terminated by any one of a
line feed ('\n'), a carriage return ('\r'), or a carriage return followed
immediately by a linefeed. |
Fields Summary |
---|
private int | lineNumberThe current line number | private int | markedLineNumberThe line number of the mark, if any | private boolean | skipLFIf the next character is a line feed, skip it | private boolean | markedSkipLFThe skipLF flag when the mark was set | private static final int | maxSkipBufferSizeMaximum skip-buffer size | private char[] | skipBufferSkip buffer, null until allocated |
Constructors Summary |
---|
public LineNumberReader(Reader in)Create a new line-numbering reader, using the default input-buffer
size.
super(in);
| public LineNumberReader(Reader in, int sz)Create a new line-numbering reader, reading characters into a buffer of
the given size.
super(in, sz);
|
Methods Summary |
---|
public int | getLineNumber()Get the current line number.
return lineNumber;
| public void | mark(int readAheadLimit)Mark the present position in the stream. Subsequent calls to reset()
will attempt to reposition the stream to this point, and will also reset
the line number appropriately.
synchronized (lock) {
super.mark(readAheadLimit);
markedLineNumber = lineNumber;
markedSkipLF = skipLF;
}
| public int | read()Read a single character. Line terminators are
compressed into single newline ('\n') characters. Whenever a line
terminator is read the current line number is incremented.
synchronized (lock) {
int c = super.read();
if (skipLF) {
if (c == '\n")
c = super.read();
skipLF = false;
}
switch (c) {
case '\r":
skipLF = true;
case '\n": /* Fall through */
lineNumber++;
return '\n";
}
return c;
}
| public int | read(char[] cbuf, int off, int len)Read characters into a portion of an array. Whenever a line terminator is read the current line number is
incremented.
synchronized (lock) {
int n = super.read(cbuf, off, len);
for (int i = off; i < off + n; i++) {
int c = cbuf[i];
if (skipLF) {
skipLF = false;
if (c == '\n")
continue;
}
switch (c) {
case '\r":
skipLF = true;
case '\n": /* Fall through */
lineNumber++;
break;
}
}
return n;
}
| public java.lang.String | readLine()Read a line of text. Whenever a line terminator is
read the current line number is incremented.
synchronized (lock) {
String l = super.readLine(skipLF);
skipLF = false;
if (l != null)
lineNumber++;
return l;
}
| public void | reset()Reset the stream to the most recent mark.
synchronized (lock) {
super.reset();
lineNumber = markedLineNumber;
skipLF = markedSkipLF;
}
| public void | setLineNumber(int lineNumber)Set the current line number.
this.lineNumber = lineNumber;
| public long | skip(long n)Skip characters.
if (n < 0)
throw new IllegalArgumentException("skip() value is negative");
int nn = (int) Math.min(n, maxSkipBufferSize);
synchronized (lock) {
if ((skipBuffer == null) || (skipBuffer.length < nn))
skipBuffer = new char[nn];
long r = n;
while (r > 0) {
int nc = read(skipBuffer, 0, (int) Math.min(r, nn));
if (nc == -1)
break;
r -= nc;
}
return n - r;
}
|
|