asia.redact.bracket.properties.line
Class LineScanner

java.lang.Object
  extended by java.io.Reader
      extended by asia.redact.bracket.properties.line.LineScanner
All Implemented Interfaces:
Closeable, Readable

public class LineScanner
extends Reader

 
 This is an augmented version of java.io.BufferedReader from the Apache Harmony implementation. Source:
 http://www.java2s.com/Open-Source/Java-Document/Apache-Harmony-Java-SE/java-package/java/io/BufferedReader.java.htm
 
 Scan a properties file conforming to the description at
 http://download.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)
 into tokens.
 
 The idea here is that as we read lines, we return not just the line text but a Line object which
 has knowledge of its internal parts, such as if the line has a key, etc. This allows for streaming
 parsing and hopefully can handle very large properties files.
 
 
 There is one additional extension: a comment line which starts with #;; is treated 
 as transient (not read in). This is used later to generate a transient header and footer
 
 This class tracks the absolute offset of lines in the file, and the line() method works like
 readLine() but returns extra info in addition to the String. The Line object returned
 by "line()" provides tokenization methods and also an absolute index of the line into the file.
 PropertiesParser2 "pulls" the lines using this BufferedReader implementation.
 
 Note: because this is a Reader, you must call close() on it when done.
 
 

See Also:
Line

Field Summary
private  char[] buf
          The characters that can be read and refilled in bulk.
private  LineEnding delimiter
           
private  int delimiterLength
           
private  int end
           
private  Reader in
           
private  int mark
           
private  int markLimit
           
private  int pos
           
private  long totalRead
           
 
Fields inherited from class java.io.Reader
lock
 
Constructor Summary
LineScanner(Reader in)
          Constructs a new BufferedReader on the Reader in.
LineScanner(Reader in, int size)
          Constructs a new BufferedReader on the Reader in.
 
Method Summary
 void close()
          Closes this reader.
private  int fillBuf()
          Populates the buffer with data.
 LineEnding getDelimiter()
           
 long getTotalRead()
           
private  boolean isClosed()
          Indicates whether or not this reader is closed.
 Line line()
           
 void mark(int markLimit)
          Sets a mark position in this reader.
 boolean markSupported()
          Indicates whether this reader supports the mark() and reset() methods.
 int read()
          Reads a single character from this reader and returns it with the two higher-order bytes set to 0.
 int read(char[] buffer, int offset, int length)
          Reads at most length characters from this reader and stores them at offset in the character array buffer.
 String readLine()
          Returns the next line of text available from this reader.
 boolean ready()
          Indicates whether this reader is ready to be read without blocking.
 void reset()
          Resets this reader's position to the last mark() location.
 long skip(long amount)
          Skips amount characters in this reader.
 
Methods inherited from class java.io.Reader
read, read
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

in

private final Reader in

buf

private char[] buf
The characters that can be read and refilled in bulk. We maintain three indices into this buffer:
     { X X X X X X X X X X X X - - }
           ^     ^             ^
           |     |             |
         mark   pos           end
Pos points to the next readable character. End is one greater than the last readable character. When pos == end, the buffer is empty and must be filled before characters can be read.

Mark is the value pos will be set to on calls to reset(). Its value is in the range [0...pos]. If the mark is -1, the buffer cannot be reset.

MarkLimit limits the distance between the mark and the pos. When this limit is exceeded, reset() is permitted (but not required) to throw an exception. For shorter distances, reset() shall not throw (unless the reader is closed).


pos

private int pos

end

private int end

mark

private int mark

markLimit

private int markLimit

totalRead

private long totalRead

delimiterLength

private int delimiterLength

delimiter

private LineEnding delimiter
Constructor Detail

LineScanner

public LineScanner(Reader in)
Constructs a new BufferedReader on the Reader in. The buffer gets the default size (8 KB).

Parameters:
in - the Reader that is buffered.

LineScanner

public LineScanner(Reader in,
                   int size)
Constructs a new BufferedReader on the Reader in. The buffer size is specified by the parameter size.

Parameters:
in - the Reader that is buffered.
size - the size of the buffer to allocate.
Throws:
IllegalArgumentException - if size <= 0.
Method Detail

close

public void close()
           throws IOException
Closes this reader. This implementation closes the buffered source reader and releases the buffer. Nothing is done if this reader has already been closed.

Specified by:
close in interface Closeable
Specified by:
close in class Reader
Throws:
IOException - if an error occurs while closing this reader.

fillBuf

private int fillBuf()
             throws IOException
Populates the buffer with data. It is an error to call this method when the buffer still contains data; ie. if pos < end.

Returns:
the number of bytes read into the buffer, or -1 if the end of the source stream has been reached.
Throws:
IOException

isClosed

private boolean isClosed()
Indicates whether or not this reader is closed.

Returns:
true if this reader is closed, false otherwise.

mark

public void mark(int markLimit)
          throws IOException
Sets a mark position in this reader. The parameter markLimit indicates how many characters can be read before the mark is invalidated. Calling reset() will reposition the reader back to the marked position if markLimit has not been surpassed.

Overrides:
mark in class Reader
Parameters:
markLimit - the number of characters that can be read before the mark is invalidated.
Throws:
IllegalArgumentException - if markLimit < 0.
IOException - if an error occurs while setting a mark in this reader.
See Also:
markSupported(), reset()

markSupported

public boolean markSupported()
Indicates whether this reader supports the mark() and reset() methods. This implementation returns true.

Overrides:
markSupported in class Reader
Returns:
true for BufferedReader.
See Also:
mark(int), reset()

read

public int read()
         throws IOException
Reads a single character from this reader and returns it with the two higher-order bytes set to 0. If possible, BufferedReader returns a character from the buffer. If there are no characters available in the buffer, it fills the buffer and then returns a character. It returns -1 if there are no more characters in the source reader.

Overrides:
read in class Reader
Returns:
the character read or -1 if the end of the source reader has been reached.
Throws:
IOException - if this reader is closed or some other I/O error occurs.

read

public int read(char[] buffer,
                int offset,
                int length)
         throws IOException
Reads at most length characters from this reader and stores them at offset in the character array buffer. Returns the number of characters actually read or -1 if the end of the source reader has been reached. If all the buffered characters have been used, a mark has not been set and the requested number of characters is larger than this readers buffer size, BufferedReader bypasses the buffer and simply places the results directly into buffer.

Specified by:
read in class Reader
Parameters:
buffer - the character array to store the characters read.
offset - the initial position in buffer to store the bytes read from this reader.
length - the maximum number of characters to read, must be non-negative.
Returns:
number of characters read or -1 if the end of the source reader has been reached.
Throws:
IndexOutOfBoundsException - if offset < 0 or length < 0, or if offset + length is greater than the size of buffer.
IOException - if this reader is closed or some other I/O error occurs.

line

public Line line()

readLine

public String readLine()
                throws IOException
Returns the next line of text available from this reader. A line is represented by zero or more characters followed by '\n', '\r', "\r\n" or the end of the reader. The string does not include the newline sequence.

Returns:
the contents of the line or null if no characters were read before the end of the reader has been reached.
Throws:
IOException - if this reader is closed or some other I/O error occurs.

ready

public boolean ready()
              throws IOException
Indicates whether this reader is ready to be read without blocking.

Overrides:
ready in class Reader
Returns:
true if this reader will not block when read is called, false if unknown or blocking will occur.
Throws:
IOException - if this reader is closed or some other I/O error occurs.
See Also:
read(), read(char[], int, int), readLine()

reset

public void reset()
           throws IOException
Resets this reader's position to the last mark() location. Invocations of read() and skip() will occur from this new location.

Overrides:
reset in class Reader
Throws:
IOException - if this reader is closed or no mark has been set.
See Also:
mark(int), markSupported()

skip

public long skip(long amount)
          throws IOException
Skips amount characters in this reader. Subsequent read()s will not return these characters unless reset() is used. Skipping characters may invalidate a mark if markLimit is surpassed.

Overrides:
skip in class Reader
Parameters:
amount - the maximum number of characters to skip.
Returns:
the number of characters actually skipped.
Throws:
IllegalArgumentException - if amount < 0.
IOException - if this reader is closed or some other I/O error occurs.
See Also:
mark(int), markSupported(), reset()

getTotalRead

public long getTotalRead()

getDelimiter

public LineEnding getDelimiter()


Copyright © 2011-2013 David R. Smith. All Rights Reserved.