|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectcom.Ostermiller.util.CircularCharBuffer
public class CircularCharBuffer
Implements the Circular Buffer producer/consumer model for characters. More information about this class is available from ostermiller.org.
Using this class is a simpler alternative to using a PipedReader and a PipedWriter. PipedReaders and PipedWriters don't support the mark operation, don't allow you to control buffer sizes that they use, and have a more complicated API that requires instantiating two classes and connecting them.
This class is thread safe.
CircularByteBuffer
,
CircularObjectBuffer
Nested Class Summary | |
---|---|
protected class |
CircularCharBuffer.CircularCharBufferReader
Class for reading from a circular character buffer. |
protected class |
CircularCharBuffer.CircularCharBufferWriter
Class for writing to a circular character buffer. |
Field Summary | |
---|---|
protected boolean |
blockingWrite
True if a write to a full buffer should block until the buffer has room, false if the write method should throw an IOException |
protected char[] |
buffer
The circular buffer. |
protected boolean |
infinite
If this buffer is infinite (should resize itself when full) |
static int |
INFINITE_SIZE
A buffer that will grow as things are added. |
protected int |
markPosition
Index of the first saved character. |
protected int |
markSize
Number of characters that have to be saved to support mark() and reset() on the Reader. |
protected java.io.Reader |
reader
The Reader that can empty this buffer. |
protected boolean |
readerClosed
true if the close() method has been called on the Reader |
protected int |
readPosition
Index of the first character available to be read. |
protected int |
writePosition
Index of the first character available to be written. |
protected java.io.Writer |
writer
The Writer that can fill this buffer. |
protected boolean |
writerClosed
true if the close() method has been called on the writer |
Constructor Summary | |
---|---|
CircularCharBuffer()
Create a new buffer with a default capacity. |
|
CircularCharBuffer(boolean blockingWrite)
Create a new buffer with a default capacity and given blocking behavior. |
|
CircularCharBuffer(int size)
Create a new buffer with given capacity. |
|
CircularCharBuffer(int size,
boolean blockingWrite)
Create a new buffer with the given capacity and blocking behavior. |
Method Summary | |
---|---|
void |
clear()
Make this buffer ready for reuse. |
int |
getAvailable()
Get number of characters that are available to be read. |
java.io.Reader |
getReader()
Retrieve a Reader that can be used to empty this buffer. |
int |
getSize()
Get the capacity of this buffer. |
int |
getSpaceLeft()
Get the number of characters this buffer has free for writing. |
java.io.Writer |
getWriter()
Retrieve a Writer that can be used to fill this buffer. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final int INFINITE_SIZE
protected char[] buffer
The actual capacity of the buffer is one less than the actual length of the buffer so that an empty and a full buffer can be distinguished. An empty buffer will have the markPostion and the writePosition equal to each other. A full buffer will have the writePosition one less than the markPostion.
There are three important indexes into the buffer: The readPosition, the writePosition, and the markPosition. If the Reader has never been marked, the readPosition and the markPosition should always be the same. The characters available to be read go from the readPosition to the writePosition, wrapping around the end of the buffer. The space available for writing goes from the write position to one less than the markPosition, wrapping around the end of the buffer. The characters that have been saved to support a reset() of the Reader go from markPosition to readPosition, wrapping around the end of the buffer.
protected volatile int readPosition
protected volatile int writePosition
protected volatile int markPosition
protected volatile int markSize
protected volatile boolean infinite
protected boolean blockingWrite
protected java.io.Reader reader
protected boolean readerClosed
protected java.io.Writer writer
protected boolean writerClosed
Constructor Detail |
---|
public CircularCharBuffer()
public CircularCharBuffer(int size)
Note that the buffer may reserve some characters for special purposes and capacity number of characters may not be able to be written to the buffer.
Note that if the buffer is of INFINITE_SIZE it will neither block or throw exceptions, but rather grow without bound.
size
- desired capacity of the buffer in characters or CircularCharBuffer.INFINITE_SIZEpublic CircularCharBuffer(boolean blockingWrite)
blockingWrite
- true writing to a full buffer should block
until space is available, false if an exception should
be thrown instead.public CircularCharBuffer(int size, boolean blockingWrite)
Note that the buffer may reserve some characters for special purposes and capacity number of characters may not be able to be written to the buffer.
Note that if the buffer is of CircularCharBuffer.INFINITE_SIZE it will neither block or throw exceptions, but rather grow without bound.
size
- desired capacity of the buffer in characters or CircularCharBuffer.INFINITE_SIZEblockingWrite
- true writing to a full buffer should block
until space is available, false if an exception should
be thrown instead.Method Detail |
---|
public void clear()
public java.io.Writer getWriter()
Write methods may throw a BufferOverflowException if the buffer is not large enough. A large enough buffer size must be chosen so that this does not happen or the caller must be prepared to catch the exception and try again once part of the buffer has been consumed.
public java.io.Reader getReader()
This Reader supports marks at the expense of the buffer size.
public int getAvailable()
Note that the number of characters available plus the number of characters free may not add up to the capacity of this buffer, as the buffer may reserve some space for other purposes.
public int getSpaceLeft()
Note that the number of characters available plus the number of characters free may not add up to the capacity of this buffer, as the buffer may reserve some space for other purposes.
public int getSize()
Note that the number of characters available plus the number of characters free may not add up to the capacity of this buffer, as the buffer may reserve some space for other purposes.
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |