Top Description Interfaces Classes Enums
module io.netty5.buffer

Package io.netty5.buffer


Abstraction of a byte buffer - the fundamental data structure to represent a low-level binary and text message. Netty uses its own buffer API instead of NIO java.nio.ByteBuffer to represent a sequence of bytes. This approach has significant advantage over using java.nio.ByteBuffer. Netty's new buffer type, io.netty5.buffer.ByteBuf, has been designed from ground up to address the problems of java.nio.ByteBuffer and to meet the daily needs of network application developers. To list a few cool features:

Extensibility

io.netty5.buffer.ByteBuf has rich set of operations optimized for rapid protocol implementation. For example, io.netty5.buffer.ByteBuf provides various operations for accessing unsigned values and strings and searching for certain byte sequence in a buffer. You can also extend or wrap existing buffer type to add convenient accessors. The custom buffer type still implements io.netty5.buffer.ByteBuf interface rather than introducing an incompatible type.

Transparent Zero Copy

To lift up the performance of a network application to the extreme, you need to reduce the number of memory copy operation. You might have a set of buffers that could be sliced and combined to compose a whole message. Netty provides a composite buffer which allows you to create a new buffer from the arbitrary number of existing buffers with no memory copy. For example, a message could be composed of two parts; header and body. In a modularized application, the two parts could be produced by different modules and assembled later when the message is sent out.
+--------+----------+
| header |   body   |
+--------+----------+
If java.nio.ByteBuffer were used, you would have to create a new big buffer and copy the two parts into the new buffer. Alternatively, you can perform a gathering write operation in NIO, but it restricts you to represent the composite of buffers as an array of java.nio.ByteBuffers rather than a single buffer, breaking the abstraction and introducing complicated state management. Moreover, it's of no use if you are not going to read or write from an NIO channel.
// The composite type is incompatible with the component type.
ByteBuffer[] message = new ByteBuffer[] { header, body };
By contrast, io.netty5.buffer.ByteBuf does not have such caveats because it is fully extensible and has a built-in composite buffer type.
// The composite type is compatible with the component type.
io.netty5.buffer.ByteBuf message = io.netty5.buffer.Unpooled.wrappedBuffer(header, body);

// Therefore, you can even create a composite by mixing a composite and an
// ordinary buffer.
io.netty5.buffer.ByteBuf messageWithFooter = io.netty5.buffer.Unpooled.wrappedBuffer(msg, footer);

// Because the composite is still a io.netty5.buffer.ByteBuf, you can access its content
// easily, and the accessor method will behave just like it's a single buffer
// even if the region you want to access spans over multiple components.  The
// unsigned integer being read here is located across body and footer.
messageWithFooter.getUnsignedInt(
    messageWithFooter.readableBytes() - footer.readableBytes() - 1);

Automatic Capacity Extension

Many protocols define variable length messages, which means there's no way to determine the length of a message until you construct the message or it is difficult and inconvenient to calculate the length precisely. It is just like when you build a java.lang.String. You often estimate the length of the resulting string and let java.lang.StringBuffer expand itself on demand.
// A new dynamic buffer is created.  Internally, the actual buffer is created
// lazily to avoid potentially wasted memory space.
io.netty5.buffer.ByteBuf b = io.netty5.buffer.Unpooled.buffer(4);

// When the first write attempt is made, the internal buffer is created with
// the specified initial capacity (4).
b.writeByte('1');

b.writeByte('2');
b.writeByte('3');
b.writeByte('4');

// When the number of written bytes exceeds the initial capacity (4), the
// internal buffer is reallocated automatically with a larger capacity.
b.writeByte('5');

Better Performance

Most frequently used buffer implementation of io.netty5.buffer.ByteBuf is a very thin wrapper of a byte array (i.e. byte[]). Unlike java.nio.ByteBuffer, it has no complicated boundary check and index compensation, and therefore it is easier for a JVM to optimize the buffer access. More complicated buffer implementation is used only for sliced or composite buffers, and it performs as well as java.nio.ByteBuffer.

Interface Summary

Modifier and TypeInterface and Description
public interface
AllocationType

An object used by buffer allocators to communicate desirable properties of an allocation to a memory manager, such as whether an allocation should be off-heap.

public interface
AllocatorControl

Methods for accessing and controlling the internals of an allocator.

public interface
Buffer

A life cycled buffer of memory, with separate reader and writer offsets.

public interface
BufferAccessor

This interface is just the primitive data accessor methods that Buffer exposes.

public interface
BufferAllocator

Interface for allocating Buffers.

public interface
BufferComponent

A view onto the buffer component being processed in a given iteration of Buffer#forEachComponent().

public interface
ByteCursor

The ByteCursor scans through a sequence of bytes.

public interface
ComponentIterator<
A type that implements Next and BufferComponent.
T extends ComponentIterator.Next & BufferComponent
>

A facade for iterating the readable or writable components of a Buffer.

public interface
CompositeBuffer

The CompositeBuffer is a concrete Buffer implementation that make a number of other buffers appear as one.

public interface
Drop<
The type of resource that can be dropped.
T
>

An interface used by Resource instances to implement their resource disposal mechanics.

public interface
LeakInfo

Information about a resource leak that happened.

public interface
MemoryManager

The choice of MemoryManager implementation also determines the choice of Buffer implementation.

public interface
Owned<
The concrete type of Resource that is owned.
T
>

This interface encapsulates the ownership of a Resource, and exposes a method that may be used to transfer this ownership to the specified recipient thread.

Class Summary

Modifier and TypeClass and Description
public class
BufferClosedException

An exception thrown when an operation is attempted on a Buffer when it has been closed.

public abstract class
BufferHolder<
The concrete BufferHolder type.
T extends Resource<T>
>

The BufferHolder is an abstract class that simplifies the implementation of objects that themselves contain a Buffer instance.

public class
BufferInputStream

An InputStream which reads data from a Buffer.

public class
BufferOutputStream

An OutputStream which writes data to a Buffer.

public class
BufferReadOnlyException

An exception thrown when an operation is attempted on a read-only Buffer.

public class
BufferRef

A mutable reference to a buffer.

public class
BufferStub

A stub of a Buffer implementation that implements all buffer methods by delegating them to a wrapped buffer instance.

public class
BufferUtil

A collection of utility methods that is related with handling ByteBuf, such as the generation of hex dump and swapping an integer's byte order.

public class
DefaultBufferAllocators

Accessor for the default, shared BufferAllocator instances.

pack-priv class
DefaultCompositeBuffer

The default implementation of the CompositeBuffer interface.

public class
LoggingLeakCallback

The LoggingLeakCallback can be installed to enable logging output when a leak is detected.

pack-priv class
public class
SensitiveBufferAllocator

This BufferAllocator is for allocating off-heap Buffers that may contain sensitive information, which should be erased from memory (overwritten) when the buffer is closed.

Enum Summary

Modifier and TypeEnum and Description
public enum
StandardAllocationTypes

Standard implementations of AllocationType that all memory managers should support.