NIO Buffer

网络IO

所有Socket通道都继承了AbstractSelectableChannel,意味着用一个Selector对象来执行socket通道的就绪选择。

1.1 SocketChannel与ServerSocketChannel

  • SocketChannel定义读和写功能的接口,而ServerSocketChannel不实现。ServerSocketChannel负责监听传入的连接和创建新的S哦创可贴Channel对象,它本身不传输数据。

1.1.2 ServerSocketChannel

ServerSocketChannel是一个基于通道的socket监听器,用于监听。
ServerSocketChannel没有bind方法
ServerSocketChannel中有accpeit方法,返回一个 SocketChannel类型的对象。在非阻塞模式下,当没有传入连接等待时,立刻返回null。

Buffer

Java NIO的Buffer用于和NIO通道进行交互,数据从通道读入缓冲区,从缓冲区写入到通道中。缓冲区本质上是一块可以写入数据,然后读取数据的内存。
所有的缓冲区类型都继承于抽象类Buffer:
Buffer继承关系

Buffer的基本用法
  1. 写入数据到Buffer
  2. 调用flip:读取数据时,需要通过flip方法将Buffer从写模式切换成读模式。
  3. 从Buffer中读取数据。
  4. 调用Clear或者compact方法:clear方法回清空整个缓冲区,compact方法只会清除已经读过的数据。
Buffer的capacity、position和limit
  • capacity:
    Buffer的固定大小值,一旦Buffer满了,需要清空才能继续写数据。
  • position:
    (1)写入数据到Buffer时,position表示写入数据的当前位置,position的初始值为0。当插入数据到Buffer后,position会移动到下一个可插入的Buffer单元。position最大值为capacity-1。
    (2)读数据到Buffer时,position表示读入数据的当前位置。通过flip方法切换到读模式的时候,position会被重置为0,当Buffer从position读入数据后,position会下移到下一个可读入的数据Buffer单元。
  • limit:
    (1)写数据时,limit表示可对Buffer最多写入多少个数据。
    (2)读数据时,limit表示Buffer中有多少可读的数据。
    NIO Buffer_第1张图片
Buffer写数据
  • 通过Channel写数到Buffer
  • 通过Buffer的put方法写数据到Buffer
Buffer读数据
  • 从Buffer中读数据到Channel
  • 使用get方法从Buffer中读取数据
Buffer的常见方法
方法 功能
rewind 将position设置为0,重新读取Buffer中的所有数据,limit保持不变
clear Buffer中内容清空掉
compact 读过的数据清除掉,未读的数据拷贝到Buffer起始处
mark/reset mark标记Buffer中的一个特定position,通过reset恢复到这个position

你可能感兴趣的:(nio)