Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

之前几章的项目里面基本上使用的是相对操作,现在下面使用一些绝对操作:

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

我相信你们看了我之前几篇博客之后,到这不能理解只有slice()方法。

 创建一个新的buffer,也就是我们通过绝对操作截取出来的那段

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

 判断上面这两个buffer是不是独立的

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

运行:

结果从2开始到5发生了变化,说明他们两个buffer共享内存。

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

 创建只读buffer:

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

这里细讲一下allocate 

源码中ByteBuffer是一个抽象类,真正的对象创建是通过allocate()方法实现的

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

打印出各自的类名:

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

我们会疑惑,那它是怎么只读的呢?

 简单来说就是,在你put的时候直接给你抛出异常,如此简单粗暴o(* ̄︶ ̄*)o

我们在ByteBuffer里面找到put方法的重写方法

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

看见没,直接抛出异常 ,没有多余的操作Σ(⊙▽⊙"!

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

其实不只是它,很多只读方法都是采取这种方式抛出异常的

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

注意:

Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer

还得说明一点,只读buffer和源buffer共享的是通过一个buffer ,当源buffer改变的时候只读buffer的内容也会发现改变。