ChannelBuffer是Netty中比较常用的一个类,其功能类似于字符数组,可以对其进行读写操作。
ChannelBuffer的模型图如下:
+-------------------+------------------+------------------+
| discardable bytes | readable bytes | writable bytes |
| | (CONTENT) | |
+-------------------+------------------+------------------+
| | | |
0 <= readerIndex <= writerIndex <= capacity
如上图所示,一个ChannelBuffer被划分为三个部分:
1.discardable:表示已经读过的内容缓冲区
2.readable:表示可读的内容缓冲区
3.writable:表示可写的内容缓冲区
ChannelBuffer的这三个缓冲区由2个内部控制指针来控制:
readerIndex:控制读缓冲区首地址
writerIndex:控制写缓冲区首地址
因此,ChannelBuffer提供的大部分操作都是围绕readerIndex和writerIndex来进行的。
ChannelBuffer的常用方法如下:
1、
read()/skip()
从readerIndex读出或跳过指定数目的字节,同时readerIndex = readerIndex + byteNumber.如果readerIndex > capacity,表示读取下标越界,会抛出
IndexOutOfBoundsException异常
readable():boolean
如果buffer有可读内容(此时writerIndex > readerIndex),则返回true,否则返回false
readerIndex():int
返回readerIndex
readableBytes():int
返回可读的字节数目(writerIndex - readerIndex)
2、
write();
写入指定数目的字节,同时writerIndex = writerIndex + byteNumber. 如果writerIndex > capacity,表示写入下标越界,会抛出
IndexOutOfBoundsException异常
writable():boolean
如果buffer有可写入空间(此时writerIndex < capacity),则返回true,否则返回false。
writerIndex(): int
返回writerIndex
writeableIndex():int
返回可写入的字节数(capacity - writerIndex)。
3、discardReadBytes()
丢弃已读的内容。其执行过程如下:
调用discardReadBytes()之前:
+-------------------+------------------+------------------+
| discardable bytes | readable bytes | writable bytes |
+-------------------+------------------+------------------+
| | | |
0 <= readerIndex <= writerIndex <= capacity
调用 discardReadBytes()方法后
+------------------+--------------------------------------+
| readable bytes | writable bytes (got more space) |
+------------------+--------------------------------------+
| | |
readerIndex (0) <= writerIndex (decreased) <= capacity
4、clear()
丢弃所有的数据,并将readerIndex和writerIndex重置为0。
调用clear()之前
+-------------------+------------------+------------------+
| discardable bytes | readable bytes | writable bytes |
+-------------------+------------------+------------------+
| | | |
0 <= readerIndex <= writerIndex <= capacity
调用clear()之后
+---------------------------------------------------------+ |
writable bytes (got more space) |
+---------------------------------------------------------+ | |
0 = readerIndex = writerIndex <= capacity
5、
markReaderIndex()
markWriterIndex()
保存readerIndex或writerIndex的状态
6、
resetReaderIndex()
resetWriterIndex()
重置readerIndex或writerIndex为最后一次保存的状态,如果没有保存过,则置为0
7、
duplicate()
slice()
拷贝和源目标共享buffer的数据区域,但是拷贝有自己的readerIndex和writerIndex以及markIndex,实际上只是拷贝了控制指针,数据区还是与源buffer共享。
8、
copy()
拷贝整个buffer,包括控制指针和数据区
测试代码如下: package test; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; public class ChannelBufferTest { /** * * @author lengxue * @date 11 Jul 2012 09:05:10 * @param args * @note */ public static void main( String[] args ) { // TODO Auto-generated method stub ChannelBuffer buffer = ChannelBuffers.buffer( 10 ); System.out.println("readable bytes: " + buffer.readableBytes( )); System.out.println("readable index: " + buffer.readerIndex( )); System.out.println("writable bytes: " + buffer.writableBytes( )); System.out.println("writable index: " + buffer.writerIndex( )); buffer.writeInt( 10 ); System.out.println("after write one integer"); System.out.println("readable bytes: " + buffer.readableBytes( )); System.out.println("readable index: " + buffer.readerIndex( )); System.out.println("writable bytes: " + buffer.writableBytes( )); System.out.println("writable index: " + buffer.writerIndex( )); buffer.writeInt( 10 ); System.out.println("after write two integer"); System.out.println("readable bytes: " + buffer.readableBytes( )); System.out.println("readable index: " + buffer.readerIndex( )); System.out.println("writable bytes: " + buffer.writableBytes( )); System.out.println("writable index: " + buffer.writerIndex( )); int i = buffer.readInt( ); System.out.println("after read one integer: " + i); System.out.println("readable bytes: " + buffer.readableBytes( )); System.out.println("readable index: " + buffer.readerIndex( )); System.out.println("writable bytes: " + buffer.writableBytes( )); System.out.println("writable index: " + buffer.writerIndex( )); buffer.discardReadBytes( ); System.out.println("after discard read bytes"); System.out.println("readable bytes: " + buffer.readableBytes( )); System.out.println("readable index: " + buffer.readerIndex( )); System.out.println("writable bytes: " + buffer.writableBytes( )); System.out.println("writable index: " + buffer.writerIndex( )); buffer.resetReaderIndex( ); System.out.println("after reset reader index"); System.out.println("readable bytes: " + buffer.readableBytes( )); System.out.println("readable index: " + buffer.readerIndex( )); System.out.println("writable bytes: " + buffer.writableBytes( )); System.out.println("writable index: " + buffer.writerIndex( )); buffer.resetWriterIndex( ); System.out.println("after reset writer index"); System.out.println("readable bytes: " + buffer.readableBytes( )); System.out.println("readable index: " + buffer.readerIndex( )); System.out.println("writable bytes: " + buffer.writableBytes( )); System.out.println("writable index: " + buffer.writerIndex( )); } } 结果输出如下: readable bytes: 0 readable index: 0 writable bytes: 10 writable index: 0 after write one integer readable bytes: 4 readable index: 0 writable bytes: 6 writable index: 4 after write two integer readable bytes: 8 readable index: 0 writable bytes: 2 writable index: 8 after read one integer: 10 readable bytes: 4 readable index: 4 writable bytes: 2 writable index: 8 after discard read bytes readable bytes: 4 readable index: 0 writable bytes: 6 writable index: 4 after reset reader index readable bytes: 4 readable index: 0 writable bytes: 6 writable index: 4 after reset writer index readable bytes: 0 readable index: 0 writable bytes: 10 writable index: 0
相关推荐
- **高性能**:Netty的`ChannelBuffer`相比传统的`java.nio.ByteBuffer`具有更高的性能。 - **灵活性**:支持多种操作模式,如直接内存模式和堆内存模式。 - **安全性**:提供了更好的内存管理机制,避免了内存泄漏...
- **使用 POJO 替代 ChannelBuffer:**Netty 允许开发者使用普通的 Java 对象 (POJO) 来替代 ChannelBuffer 进行数据处理。 - **应用程序关闭:**介绍了如何优雅地关闭 Netty 应用程序,确保所有资源被正确释放。 #...
#### 一、Netty简介与问题解析 - **标题**:Netty教程用户手册 - **描述**:Netty教程用户手册为用户提供了一个全面了解Netty的基础,帮助初学者快速入门。 - **标签**:Netty教程用户手册、Netty、Netty用户手册 ...
#### 一、Netty 3.2.5 终极手册简介 《Netty-3.2.5终极手册》是一本全面介绍Netty 3.2.5版本的指南书籍,旨在为开发者提供快速开发网络应用的方法与技巧。本书不仅涵盖了Netty的基本概念和入门教程,还深入探讨了其...
此外,手册还指导开发者如何用 POJO 替换 ChannelBuffer,以提高代码的可读性和易用性,以及如何优雅地关闭应用程序。 第二章则深入介绍了 Netty 的架构概览,包括其丰富的缓存数据结构、统一的异步 I/O API、基于...
netty pojo netty pojo替换 channelbuffer
- **使用 POJO 代替 ChannelBuffer**:介绍如何使用普通的 Java 对象(POJOs)替代 ChannelBuffer 进行数据交换,提高代码的可读性和可维护性。 - **关闭应用**:正确的关闭顺序对于资源释放至关重要,Netty 提供...
Netty 是一个专门为快速开发高性能、高可靠性网络应用而设计的 Java 框架。它提供了异步事件驱动的网络应用程序框架,使得开发者能够轻松创建网络服务器和客户端。Netty 3.1 中文用户手册提供了详细的指南,帮助...
Netty使用`ChannelBuffer`接口来封装缓冲区的功能,提供了比标准Java NIO `ByteBuffer`更高级的操作方式。 1. **HeapChannelBuffer**:这是Netty提供的一个实现`ChannelBuffer`接口的具体类。它的数据存储在Java堆...
7. **Codec**:Netty 提供了一系列编解码器,用于将各种协议数据转换为 ChannelBuffer 和反向操作,如 HTTP、TCP、UDP 等。 通过对“Netty 权威指南第二版源码”的学习,你可以: - 理解 Netty 的事件模型和线程...
首先,ChannelBuffer是Netty中用于网络数据交换的字节容器。在Netty中,所有的网络数据都是通过ChannelBuffer进行读写的。它的作用类似于Java NIO中的ByteBuffer,但它提供了更加丰富的功能。ChannelBuffer有...
#### 一、Netty框架简介 Netty是一款高性能的网络应用开发框架,它采用事件驱动的方式处理网络通信,主要用于简化网络编程的复杂度,提升开发效率与系统性能。根据给定文档的描述部分可以看到,Netty的设计理念旨在...
这个过程介绍了如何构建一个基础的Netty服务端和客户端,以及如何处理ChannelBuffer,即Netty中的数据容器。 手册接着提供了对ReceivedData的详解,通过编写Echo服务,即对收到的任何消息进行回显,来进一步解释...
在数据处理方面,Netty 使用了ChannelBuffer接口,它是网络数据读写的基础。ChannelBuffer提供了高效的数据操作方法,支持零拷贝,减少了内存开销,提高了性能。同时,Netty 提供了多种ChannelBufferFactory,可以...
6. **零拷贝**:Netty通过直接内存和ChannelBuffer的组合,实现了操作系统级别的零拷贝技术,有效降低了CPU的负载,提升了网络传输效率。 7. **安全性**:ByteBuf还提供了安全的边界检查,防止越界访问导致的运行时...