public abstract class AbstractByteArrayBufferBuffer extends Object implements ProcessableByteArrayBuffer, ComposedByteBuffer
ProcessableByteArrayBuffer
interface for a byte[]
-Buffer that represents the concatenation of multiple ByteArrayBufferImpl
s. It has its own state
(read-pointer) and does NOT modify a contained buffer
when reading. If one of the
underlying buffers
has been read to the end
this class steps to the next one in a rotating way until the last buffer has been reached, that contains data that
has NOT been read before. Further this class allows to be (re)filled
. Modifier and Type | Field and Description |
---|---|
private ByteArrayBufferImpl[] |
buffers
The actual buffers.
|
private int |
buffersEndIndex
The index of the last buffer out of
buffers . |
private int |
buffersIndex
The index of the current buffer out of
buffers . |
private int |
bufferStepCount
The number of buffers that have been stepped through.
|
private byte[] |
currentBufferBytes
The value of
. |
private int |
currentBufferIndex
The current position in
. |
private int |
currentBufferMax
The value of
. |
Modifier | Constructor and Description |
---|---|
protected |
AbstractByteArrayBufferBuffer(AbstractByteArrayBufferBuffer template)
The constructor used to copy from the given
template . |
|
AbstractByteArrayBufferBuffer(ByteArrayBufferImpl... buffers)
The constructor.
|
Modifier and Type | Method and Description |
---|---|
int |
fill(byte[] buffer,
int offset,
int length)
This method fills the given
buffer starting at offset with the next bytes from this
ComposedByteBuffer . |
protected boolean |
fill(InputStream inputStream)
This method fills this buffer using the given
inputStream . |
ByteArray |
getByteArray(int index)
This method gets the
ByteArray at the given index . |
int |
getByteArrayCount()
This method gets the number of
ByteArray s currently available via ComposedByteBuffer.getByteArray(int) . |
int |
getBytesAvailable()
This method gets the number of bytes available.
|
protected ByteArrayBuffer |
getCurrentBuffer()
This method gets the current
ByteArrayBufferImpl . |
protected int |
getCurrentBufferIndex()
This method gets the current index in the
current buffer . |
boolean |
hasNext()
This method determines if there is a
next byte available. |
byte |
next()
This method gets the current byte in the iteration.
|
protected boolean |
nextBuffer()
This method switches the
current buffer to the next available buffer. |
byte |
peek()
This method gets the current byte in the iteration.
|
long |
process(ByteProcessor processor,
long byteCount)
This method processes the number of bytes given by
length (as far as available) using the given
processor . |
long |
skip(long byteCount)
This method skips the number of bytes given by
byteCount . |
protected void |
sync(AbstractByteArrayBufferBuffer master)
This method synchronizes the buffer with the given
master . |
private final ByteArrayBufferImpl[] buffers
private int buffersIndex
buffers
.private int buffersEndIndex
buffers
.private int bufferStepCount
private int currentBufferIndex
buffers
[buffersIndex
]
.private int currentBufferMax
buffers
[buffersIndex
].getMaximumIndex()
.private byte[] currentBufferBytes
buffers
[buffersIndex
].getBytes()
.public AbstractByteArrayBufferBuffer(ByteArrayBufferImpl... buffers)
buffers
- are the buffers to concat.protected AbstractByteArrayBufferBuffer(AbstractByteArrayBufferBuffer template)
template
.template
- is the buffer to copy.protected ByteArrayBuffer getCurrentBuffer()
ByteArrayBufferImpl
.ByteArrayBufferImpl
.protected int getCurrentBufferIndex()
current buffer
.current buffer
.protected boolean nextBuffer()
current buffer
to the next available buffer. If this method is
called when the last buffer has already been reached, the index
will be set to
getCurrentBuffer()
.getMaximumIndex()
+1
so the
end of this buffer is reached and hasNext()
will return false
.true
if there was a next buffer to switch to, false
if the current buffer
is already the last one.public int getBytesAvailable()
ByteProvider
getBytesAvailable
in interface ByteProvider
public boolean hasNext()
ByteIterator
next byte
available.hasNext
in interface ByteIterator
true
if there is a next byte
available, false
otherwise (if the end of this
buffer has been reached).public byte next() throws NoSuchElementException
ByteIterator
ByteIterator
points
to the next byte in the iteration or to the end if there is no such byte available
. ByteIterator.hasNext()
returns true
.next
in interface ByteIterator
NoSuchElementException
- if there is no such byte available
.Iterator.next()
public byte peek() throws NoSuchElementException
ByteIterator
ByteIterator.next()
this method does NOT modify the state of
this ByteIterator
. Therefore the peeked byte does NOT get consumed and repetitive calls will return the
same value. ByteIterator.hasNext()
returns true
.peek
in interface ByteIterator
NoSuchElementException
- if there is no such byte available
.ByteIterator.next()
public long skip(long byteCount)
ByteIterator
byteCount
.skip
in interface ByteIterator
byteCount
- is the expected number of bytes to skip.byteCount
.
However the value may be less if the end of this iterator has been reached before the according number of
bytes have been skipped. The value will always be greater or equal to 0
.InputStream.skip(long)
public long process(ByteProcessor processor, long byteCount)
ByteProcessable
length
(as far as available) using the given
processor
.process
in interface ByteProcessable
processor
- is the ByteProcessor
called to process the bytes. It may be called multiple types if the
data is sliced into multiple byte-arrays.byteCount
- is the desired number of bytes to process. The value has to be greater or equal to 0
. A value
of 0
will have no effect. If you want to process all available data to the end of stream or buffer
you may use Long.MAX_VALUE
.length
this will typically
be equal to length
. However if the end of the data has been reached, a smaller value is returned.
The value will always be greater or equal to 0
.protected void sync(AbstractByteArrayBufferBuffer master)
master
.master
- is the buffer this buffer was created from.protected boolean fill(InputStream inputStream) throws IOException
inputStream
. If the buffer is already filled, this method
will have no effect and return false
.inputStream
- is the InputStream
providing the data to fill this buffer with.true
if the end of the stream was encountered while (re)filling this buffer, false
otherwise.IOException
- if caused by the inputStream
whilst reading.public int fill(byte[] buffer, int offset, int length)
ComposedByteBuffer
buffer
starting at offset
with the next
bytes from this
ComposedByteBuffer
. The bytes that are filled into the given buffer
will therefore be consumed.
This method can be used to write data from this buffer to an OutputStream
or supply it to the
consumer of an InputStream
.fill
in interface ComposedByteBuffer
buffer
- is the buffer to fill.offset
- is the index in the given buffer
where to fill in the first byte. See
ByteArray.getCurrentIndex()
.length
- is the expected number of bytes to fill into buffer
. Has to be positive and less or equal to
buffer.length - offset
. However at most the number of available bytes
can be filled even if length
is greater.buffer
. Will be positive and less or
equal to the given length
. Should be only less than maxLength
if NOT enough
bytes are available
.public ByteArray getByteArray(int index)
ComposedByteBuffer
ByteArray
at the given index
. The
DetectorStreamBuffer
is composed out of ByteArray
s. This method allows
efficient processing of bytes from byte[]
rather then calling ByteIterator.hasNext()
and ByteIterator.next()
and
repetitive. Additionally this way allows full lookahead up to the end of the buffer without consuming the data.
ByteIterator.next()
or ByteIterator.skip(long)
will invalidate the returned ByteArray
.
Please do NOT call these methods while working with ByteArray
s.getByteArray
in interface ComposedByteBuffer
index
- is the index of the requested ByteArray
. It has to be in the range from 0
to
ComposedByteBuffer.getByteArrayCount()
- 1
. A value of 0
indicates the current ByteArray
this
buffer is currently pointing to. For that current buffer ByteArray.getBytes()
[
ByteArray.getCurrentIndex()
]
will have the same result as ByteIterator.peek()
.ByteArray
.ComposedByteBuffer.getByteArrayCount()
public int getByteArrayCount()
ComposedByteBuffer
ByteArray
s currently available via ComposedByteBuffer.getByteArray(int)
. ByteIterator.next()
or ByteIterator.skip(long)
will invalidate the returned ByteArray
.
Please do NOT call these methods while working with ByteArray
s.getByteArrayCount
in interface ComposedByteBuffer
ByteArray
s.Copyright © 2001–2016 mmm-Team. All rights reserved.