从Java NIO到Netty(三)

Java NIO组件介绍

Buffer

从第一章我们了解到Channel和Buffer可以互相读写,其本质是是一块可以写入数据,然后可以从中读取数据的内存。要了解其原理,首先需要知道三个属性:

  • capacity:Buffer的规模大小
  • position:写模式下,position表示当前的位置,写入一个数据后,position就移动到下一个Buffer单元;当Buffer从写模式切换到读模式,position会被重置为0. 当从Buffer的position处读取数据时,position向前移动到下一个可读的位置
  • limit:在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据,所以等于Buffer的capacity;当切换到读模式时, limit表示你最多能读到多少数据

配图说明:

image.png

1 Buffer类型

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

2 分配一个Buffer

ByteBuffer buf = ByteBuffer.allocate(48);
复制代码

3 向Buffer中写入数据

int bytesRead = inChannel.read(buf); 
复制代码

使用put()方法

buf.put(127);
复制代码

4 翻转操作:flip()

flip()是切换Buffer的读模式和写模式

5 从Buffer读取数据

int bytesWritten = inChannel.write(buf);
复制代码

使用get()方法

byte aByte = buf.get();
复制代码

6 clear()和compact()方法

前提:一旦读完Buffer中的数据,需要让Buffer准备好再次被写入。可以通过clear()或compact()方法来完成。
区别:clear()会将position置为0,limit置为capacity,换句话说Buffer被清空了;如果Buffer中仍有未读的数据,切后续还需要,这时候想先写数据,就用compact(),compact()将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享