Class CircularByteBuffer
Using this class is a simpler alternative to using a PipedInputStream and a PipedOutputStream. PipedInputStreams and PipedOutputStreams 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.
- Since:
- ostermillerutils 1.00.00
- Author:
- Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected classClass for reading from a circular byte buffer.protected classClass for writing to a circular byte buffer. -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected booleanTrue if a write to a full buffer should block until the buffer has room, false if the write method should throw an IOException.protected byte[]The circular buffer.protected InputStreamThe InputStream that can empty this buffer.protected booleanIf this buffer is infinite (should resize itself when full).static final intA buffer that will grow as things are added.protected booleantrue if the close() method has been called on the InputStream.protected intIndex of the first saved byte.protected intNumber of bytes that have to be saved to support mark() and reset() on the InputStream.protected OutputStreamThe OutputStream that can fill this buffer.protected booleantrue if the close() method has been called on the OutputStream.protected intIndex of the first byte available to be read.protected intIndex of the first byte available to be written. -
Constructor Summary
ConstructorsConstructorDescriptionCreate a new buffer with a default capacity.CircularByteBuffer(boolean blockingWrite) Create a new buffer with a default capacity and given blocking behavior.CircularByteBuffer(int size) Create a new buffer with given capacity.CircularByteBuffer(int size, boolean blockingWrite) Create a new buffer with the given capacity and blocking behavior. -
Method Summary
Modifier and TypeMethodDescriptionvoidclear()Make this buffer ready for reuse.intGet number of bytes that are available to be read.Retrieve a InputStream that can be used to empty this buffer.Retrieve a OutputStream that can be used to fill this buffer.intgetSize()Get the capacity of this buffer.intGet the number of bytes this buffer has free for writing.
-
Field Details
-
INFINITE_SIZE
public static final int INFINITE_SIZEA buffer that will grow as things are added.- Since:
- ostermillerutils 1.00.00
- See Also:
-
buffer
protected byte[] bufferThe circular 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 InputStream has never been marked, the readPosition and the markPosition should always be the same. The bytes 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 bytes that have been saved to support a reset() of the InputStream go from markPosition to readPosition, wrapping around the end of the buffer.
- Since:
- ostermillerutils 1.00.00
-
readPosition
protected volatile int readPositionIndex of the first byte available to be read.- Since:
- ostermillerutils 1.00.00
-
writePosition
protected volatile int writePositionIndex of the first byte available to be written.- Since:
- ostermillerutils 1.00.00
-
markPosition
protected volatile int markPositionIndex of the first saved byte. (To support stream marking.)- Since:
- ostermillerutils 1.00.00
-
markSize
protected volatile int markSizeNumber of bytes that have to be saved to support mark() and reset() on the InputStream.- Since:
- ostermillerutils 1.00.00
-
infinite
protected volatile boolean infiniteIf this buffer is infinite (should resize itself when full).- Since:
- ostermillerutils 1.00.00
-
blockingWrite
protected boolean blockingWriteTrue if a write to a full buffer should block until the buffer has room, false if the write method should throw an IOException.- Since:
- ostermillerutils 1.00.00
-
in
The InputStream that can empty this buffer.- Since:
- ostermillerutils 1.00.00
-
inputStreamClosed
protected boolean inputStreamClosedtrue if the close() method has been called on the InputStream.- Since:
- ostermillerutils 1.00.00
-
out
The OutputStream that can fill this buffer.- Since:
- ostermillerutils 1.00.00
-
outputStreamClosed
protected boolean outputStreamClosedtrue if the close() method has been called on the OutputStream.- Since:
- ostermillerutils 1.00.00
-
-
Constructor Details
-
CircularByteBuffer
public CircularByteBuffer()Create a new buffer with a default capacity. Writing to a full buffer will block until space is available rather than throw an exception.- Since:
- ostermillerutils 1.00.00
-
CircularByteBuffer
public CircularByteBuffer(int size) Create a new buffer with given capacity. Writing to a full buffer will block until space is available rather than throw an exception.Note that the buffer may reserve some bytes for special purposes and capacity number of bytes 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.
- Parameters:
size- desired capacity of the buffer in bytes or CircularByteBuffer.INFINITE_SIZE.- Since:
- ostermillerutils 1.00.00
-
CircularByteBuffer
public CircularByteBuffer(boolean blockingWrite) Create a new buffer with a default capacity and given blocking behavior.- Parameters:
blockingWrite- true writing to a full buffer should block until space is available, false if an exception should be thrown instead.- Since:
- ostermillerutils 1.00.00
-
CircularByteBuffer
public CircularByteBuffer(int size, boolean blockingWrite) Create a new buffer with the given capacity and blocking behavior.Note that the buffer may reserve some bytes for special purposes and capacity number of bytes 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.
- Parameters:
size- desired capacity of the buffer in bytes or CircularByteBuffer.INFINITE_SIZE.blockingWrite- true writing to a full buffer should block until space is available, false if an exception should be thrown instead.- Since:
- ostermillerutils 1.00.00
-
-
Method Details
-
clear
public void clear()Make this buffer ready for reuse. The contents of the buffer will be cleared and the streams associated with this buffer will be reopened if they had been closed.- Since:
- ostermillerutils 1.00.00
-
getOutputStream
Retrieve a OutputStream that can be used to fill this buffer.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.
- Returns:
- the producer for this buffer.
- Since:
- ostermillerutils 1.00.00
-
getInputStream
Retrieve a InputStream that can be used to empty this buffer.This InputStream supports marks at the expense of the buffer size.
- Returns:
- the consumer for this buffer.
- Since:
- ostermillerutils 1.00.00
-
getAvailable
public int getAvailable()Get number of bytes that are available to be read.Note that the number of bytes available plus the number of bytes free may not add up to the capacity of this buffer, as the buffer may reserve some space for other purposes.
- Returns:
- the size in bytes of this buffer
- Since:
- ostermillerutils 1.00.00
-
getSpaceLeft
public int getSpaceLeft()Get the number of bytes this buffer has free for writing.Note that the number of bytes available plus the number of bytes free may not add up to the capacity of this buffer, as the buffer may reserve some space for other purposes.
- Returns:
- the available space in bytes of this buffer
- Since:
- ostermillerutils 1.00.00
-
getSize
public int getSize()Get the capacity of this buffer.Note that the number of bytes available plus the number of bytes free may not add up to the capacity of this buffer, as the buffer may reserve some space for other purposes.
- Returns:
- the size in bytes of this buffer
- Since:
- ostermillerutils 1.00.00
-