原理简介:
1、从存储方式上,ByteBuf分为:HeapByteBuf和DirectByteBuf
HeapByteBuf是用byte数组格式来存储数据,在JVM内部开辟缓冲区,在数据操作前先把数据复制到byte数组再进行处理。因为中间增加了一层数据复制操作,会有一定的性能损耗。DirectByteBuf是使用java.nio.ByteBuffer来存储数据。利用java.nio.ByteBuffer是借助于JVM调用操作系统的底层通信函数,直接操作直接缓冲区可以减少中间缓冲区的复制操作,进而提供程序性能。
2、从空间初始化方式上来分,ByteBuf分为:缓存方式分配和非缓存方式分配。
空间分配工具类:PooledByteBufAllocator和UnpooledByteBufAllocator,其中UnpooledByteBufAllocator在外又封装了一个类Unpooled。
ByteBuf方法说明:
1、capacity()方法和capacity(newCapacity)
无参时返回现有容量大小,有参数时设置新的容量大小。ByteBuf在这里做了优化,自动扩容优化
private void ensureWritable0(int minWritableBytes) { if (minWritableBytes <= writableBytes()) { return; } if (minWritableBytes > maxCapacity - writerIndex) { throw new IndexOutOfBoundsException(String.format( "writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s", writerIndex, minWritableBytes, maxCapacity, this)); } // Normalize the current capacity to the power of 2. //计算新的容量,新的容量=当前容量*2 再取2^n 最接近当前容量*2的数值 int newCapacity = alloc().calculateNewCapacity(writerIndex + minWritableBytes, maxCapacity); // Adjust to the new capacity. // 设置ByteBuf新的容量 capacity(newCapacity); }
2、readableBytes()和readBytes(obj);
readableBytes()返回当前可读的字节数:从readIndex到结尾的字节数。一般用于读取数据前进行数据完整性的判断。
readBytes()读取数据到指定的obj变量中(还有其他参数)。
3、writableBytes()和maxWritableBytes()
writableBytes()是返回当前capacity可写入的字节数是多少;
maxWritableBytes()是返回ByteBuf创建时的maxCapacity可写入的字节数是多少
4、markReaderIndex()和resetReaderIndex()
markReaderIndex()把当前的readerIndex赋值到markReaderIndex中。
resetReaderIndex()重设readerIndex,把markIndex赋值到readerIndex。
这两个方法和readableBytes()、readBytes()结合使用可以完成数据的读取操作
5、markWriterIndex()和resetWriterIndex()
markWriterIndex()方法是把当前writeIndex赋值到markWriteIndex中。
resetWriterIndex()是把writeIndex设置为markWriteIndex的值。
6、writeBytes()
写数据函数,把数据吸入到ByteBuf中。
一般在写数据时和markWriterIndex()和resetWriterIndex()结合使用
7、clear()
清空ByteBuf,同时把readerIndex、markReaderIndex、writeIndex、markWriteIndex等设置为0
ByteBuf和ByteBuffer
在java.nio.ByteBuffer有capacity、position、limit、mark四种概念,除了容量不会改变以外,position、limit和mark在读写时都会发生改变,并且在读操作前要调用flip()方法重设position和limit才可以正确读出写入的数据。
而在netty的ByteBuf中,封装时重新定义了readerIndex和writeIndex,在读写时只是操作对应的标志位,开发者在使用当中读写时不用关心position、limit、mark,也不用执行flip()方法就可以很方便的读写操作。
java.nio.Bytebuffer读写实例:
ByteBuffer buf = ByteBuffer.allocate(10);
buf.put(xxx);//写完毕转读取时
buf.flip();//必须调用,否则读取的数据不正确
buf.get(xxx);
而使用netty的ByteBuf时不需要关心这些指针,如:
ByteBuf buf = xxx;//生成新的ByteBuf
byte writeData[] = {...};
buf.writeBytes(writeData);//写入数据
byte readData[] = new byte[11];
buf.readBytes(readData);//不用其他操作,可直接读取
通过上面的示例可以看出,netty的ByteBuf使用起来更方便
相关推荐
Netty ByteBuf 的零拷贝(Zero-Copy)理解 Netty 中的零拷贝(Zero-Copy)是指在操作数据时,不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域,这样可以减少 CPU 的负载和内存带宽的占用。 Zero-Copy 通常...
ByteBuf是Java的Netty框架中的一个核心组件,它是一个高效、线程安全的字节缓冲区,用于处理网络I/O。在Rust编程语言中,`bytebuf-rs`项目是一个模仿Netty ByteBuf设计的库,旨在提供类似的性能特性和功能。本文将...
netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。
2. **Netty中的 ByteBuf**:Netty的ByteBuf提供了多种方法来读写字节,但并未涉及字符编码。例如,`writeBytes()`用于写入字节数组,`writeCharSequence()`则允许指定编码写入字符序列。在处理字符串时,确保使用`...
将Netty ByteBuf的相关类,进行梳理总结、源码分析,通过思维导图的注释看源码!
ByteBuf是Netty提供的字节缓冲区,它是Java NIO ByteBuffer的一个增强版。ByteBuf提供了一种更高效的内存管理方式,支持读写索引独立,避免了BufferOverflow和BufferUnderflow等异常。它还支持堆内和堆外内存,以及...
Netty 提供了 `ByteBuf` 类作为缓冲区,用于高效地存储和操作字节数据。`ByteBuf` 支持读写操作,可以用于处理16进制数据。通过 `ByteBuf` 的方法,如 `readByte()`、`writeByte()`、`readInt()` 和 `writeInt()` ...
- **Buffer**:Netty的ByteBuf提供了高效的数据存储和传输功能,优于Java原生的ByteBuffer。 4. **Netty编程模型**:包括客户端和服务端的创建、连接建立、数据读写、异常处理等,通过编写自定义的Handler来实现...
此外,Netty的ByteBuf类是高效内存管理的关键,它提供了缓冲区的读写操作,避免了不必要的数据拷贝。 在高级特性部分,书籍会涉及Netty的编解码器,如LineBasedFrameDecoder用于处理以换行符分隔的协议,以及...
2. **ByteBuf操作**:Netty的ByteBuf提供了高效的字节操作,支持读写索引的独立控制,以及读写区域的分离。在解析过程中,会用到readInt(), readByte()等方法来读取消息头和消息体的数据。 3. **消息体解析**:由于...
3. **ByteBuf**:Netty提供了自己的ByteBuf类,作为缓冲区,它比Java的ByteBuffer更易用且高效,支持直接内存和堆内存操作,避免了频繁的内存复制。 4. **零拷贝**:Netty通过使用FileRegion实现零拷贝,减少了CPU...
- Netty 的 ByteBuf 提供了高效的内存管理,避免了频繁的字节数组拷贝。 2. **WebSocket 协议** - WebSocket 协议通过 HTTP/HTTPS 协议握手建立连接,之后即可在连接上进行双向数据传输,无需重复的 HTTP 请求/...
此外,Netty的ByteBuf是高效的数据缓冲区,提供了比Java NIO Buffer更友好的API。它支持预读和后写,可以在不复制数据的情况下进行读写操作,从而提高了性能。 书中的代码案例会涵盖如何创建服务器、建立连接、处理...
此外,还会涉及ByteBuf,这是Netty提供的高效内存管理工具,用于替代Java的ByteBuffer,提供更友好的API和更好的性能。 Netty的案例实战部分可能会涵盖常见网络协议的实现,如HTTP、HTTPS、FTP、WebSocket等,这些...
5. **池化技术**:为减少内存分配和释放的开销,Netty引入了ByteBuf池,通过复用已分配的ByteBuf实例,减少了频繁的内存申请和释放,从而提高了性能。 6. **零拷贝**:Netty通过直接内存和ChannelBuffer的组合,...
4. **高效的内存管理**:Netty 使用ByteBuf作为字节缓冲区,它提供了一种更高效的方式管理网络通信中的内存,避免了Java原生的ByteBuffer带来的性能损耗。 5. **强大的编码解码器**:Netty 提供了各种编码解码器,...
3. **ByteBuf**:Netty提供的ByteBuf作为字节缓冲区,比Java的ByteBuffer更加灵活和高效。它支持读写指针独立移动,避免了不必要的内存复制。 4. **Pipeline**:Netty的ChannelHandler链是通过Pipeline实现的。...
2. **ByteBuf**:Netty 提供了 ByteBuf 作为缓冲区,相比传统的 ByteBuffer 更加高效,支持零拷贝,方便进行数据读写操作。 3. **ChannelHandler**:这是 Netty 中的核心组件,负责处理网络事件,如连接、读写、...
此外,Netty的ByteBuf是高效的数据缓冲区,提供了比Java NIO Buffer更高级别的API。它支持直接内存操作,减少了不必要的对象创建和拷贝,提高了性能。书中将详细介绍ByteBuf的使用方法和最佳实践。 书中还会涉及...
在 Netty 中,ByteBuf 是一个高效且灵活的字节缓冲区,它解决了 Java NIO 中 ByteBuffer 的一些限制和不便。 首先,让我们深入理解 ByteBuffer 的局限性: 1. 固定长度:ByteBuffer 在创建时分配了固定的容量,一旦...