I need a byte buffer class in Java for single-threaded use. I should be able to insert data at the back of the buffer and read data at the front, with an amortized cost of O(1).
I have written such a class: ByteRingBuffer
It does not resize automatically, but there is a resize() method.
It's "well-tested" with an automatic test program, that uses random numbers to test all possible situations.
Not sure if it is "the best", but you have a nice example of Circular Byte buffer here.
Those Java Utilities - OstermillerUtils classes are under GPL license.
This Circular Byte Buffer implements the circular buffer producer/consumer model for bytes. Filling and emptying the buffer is done with standard Java InputStreams and OutputStreams.
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 a instantiating two classes and connecting them.
I'm using a java.util.ArrayDeque<Byte>
in a project with similar requirements. Note that you can easily change implementation using a java.util.concurrent Queue
implementation.
Another solution is to use GrowablePipedOutputStream and GrowablePipedInputStream by JBoss.
I wonder if this one works well
https://svn.apache.org/repos/asf/etch/releases/release-1.0.0/util/src/main/java/etch/util/CircularByteBuffer.java
We will probably try this one since it is apache license.