Bytes
This library contains an immutable representation of sequence of bytes: com.avast.bytes.Bytes
.
The goal is to provide single immutable representation of bytes that is not dependent on a third-party library (like com.google.protobuf.ByteString
). However, multiple implementations of the Bytes
interface can be created using third-party libraries to take advantage of their benefits (io.netty.buffer.ByteBuf
for example). Implementations that require third-party dependencies will be separated to their own module, while the core module provides only the API and implementations based on Java standard library.
Features of Bytes include:
- reading encapsulated data using random (
Bytes.byteAt(int)
) and linear (Bytes.newInputStream()
) access - zero copy substring views (
Bytes.view(int, int)
) - zero copy concat (
Bytes.concat(otherBytes)
) - utility methods for reading & writing hex strings (
Bytes.copyFromHex(someBytes.toHexString)
) - reading directly from
InputStream
(in some implementations, e.g.ByteArrayBytes.readFrom(is)
orByteArrayBytes.readFrom(is, offset, length)
)
Usage
Parsing Google Protocol Buffer message: Assume NotificationData
is a class generated by protoc
.
Bytes bytes = ...
try (InputStream bytesStream = bytes.newInputStream()) {
NotificationData message = NotificationData.parseFrom(bytesStream);
}
Serializing Google Protocol Buffer message to Bytes
:
NotificationData message = ...
try (Bytes.BuilderStream builder = ByteBufBytes.newBuilder(message.getSerializedSize())) {
message.writeTo(builder);
Bytes bytes = builder.toBytes();
}
...or serialize the message to ByteString
as usual and wrap it with ByteStringBytes
.
JDK-based implementations
The core
module contains two implementations:
ByteArrayBytes
- backed bybyte[]
ByteBufferBytes
- backed byjava.nio.ByteBuffer
ByteArrayBytes bab = ByteArrayBytes.copyFrom(new byte[]{0, 0, 7});
ByteBufferBytes bbb = ByteBufferBytes.copyFrom(ByteBuffer.allocate(1024)); // the most useless buffer ever
com.google.protobuf.ByteString wrapper
The gpb
module provides ByteStringBytes
that implements Bytes
by wrapping com.google.protobuf.ByteString
.
ByteStringBytes bsb = ByteStringBytes.wrap(ByteString.copyFromUtf8("foo"));