Netty的深入浅出--29.NIO中Scattering与Gatterring深度解析
上一章中讲解了byteBuffer创建的几种类型,现在我们继续深入讲一下directByteBuffer。
我们可以看到directByteBuffer是继承于MapperByteBuffer这个父类
看一下MapperByteBuffer中的源码描述
定义的说了:直接字节缓存是一个内存映射范围的文件。
简单来说就是,directByteBuffer是一个内存映射文件,在堆外内存中,由操作系统控制写入磁盘。
实例:
在强调一点,它是位于堆外内存的。
文件锁:
共享锁和排他锁
这里还是要说一下,在IO操作文件的时候我们使用的是FileInput和FileOutput,而在NIO中操作文件的时候采用的是RandomAccessFile。
文件锁中参数:
position:从哪里开始锁
size:锁的大小
share:是共享锁还是排他锁
实例:
我们只要大概了解就可以了,在实际使用中基本上很少使用。
现在我们进入主题。
关于ByteBuffer的Scattering与Gathering
我们在之前的例子里面只有一个byteBuffer,这样的话,数据都是写在一个bytebuffer中,但是如果我们创建一个byteBuffer数组的话,我们就可以通过控制每个byteBuffer的容量大小,来控制数据存储的位置。
就比如说:客户端传来一个http请求,如果我们采用byteBuffer数组的话,就可以将http请求分隔开,一部分存储请求头,一部分存储请求信息等。
打印读写前后 position和limit的指向位置。
启动服务器:
由于我们只写了服务端,因此我们需要通过telnet(windows)或者nc(linux) 来与 服务器连接传输数据;
这里我要解释一下,换行符也属于一个字节,所以
hellowor
是9个字节!
当字节不足9个的时候,写操作进入死循环
现在是8个字节,还是不行
在加一个换行,就刚好9个字节
当超过9个字节的时候,会读写完成9个字节的之后,多出来的又继续等待,一直死循环
使用telnet也是可以连接的