二、[ Java NIO ] NIO与IO对比,并深入详解NIO核心属性状态

NIO的介绍:

(1)、java.io中最为核心的一个概念是流(stream) ,面向流的编程。

(2)、Java中,一个流要么是输入流,要么是输出流,不可能同时既是输入流又是输出流。

(3)、java.nio中拥有3个核心概念: selector,Channel与Buffer。

关系如下:

二、[ Java NIO ] NIO与IO对比,并深入详解NIO核心属性状态_第1张图片

(4)、在java.nio中,我们是面向块(block)或是缓冲区(buffer)编程的。

(5)、Buffer本身就是一块内存,底层实现上,它实际上是个数组。数据的读、写都是通过Buffer来实现的。

(6)、除了数组之外, Buffer还提供了对于数据的结构化访问方式,并且可以追踪到系统的读写过程。

(7)、Java中的8种原生数据类型都有各自对应的Buffer类型,如IntBuffer, LonqBuffer, ByteBuffer及CharBuffer等等。

(8)、Channel指的是可以向其写入数据或者从中读取数据的对象,他类似java.io中的Stream。

(9)、所有数据的读写都是通过Buffer来进行的,永远不会出现直接向Channel写入数据的情况,或者从Channel读取数据的情况。

(10)、与stream不同的是, Channel是双向的,一个流只可能是InputStream或是OutputStream, Channel打开后则可以进行读取、写入或是读写。

(11)、由于Channel是双向的,因此它能更好地反映出底层操作系统的真实情况;在Linux系统中,底层操作系统的通道就是双向的。

 

NIO中三个重要状态属性的含义:position,limit,capacity:

(1)、capacity:缓冲区的容量,是Buffer它包含的元素数量。缓冲区的容量从不为负值,也从不改变。

(2)、limit:缓冲区的limit是第一个不被读或写的元素的索引。缓冲区的limit从不为负,也从不为负,

    也从不大于它的容量(capacity)。

(3)、position:缓冲区的位置是下一个要被读或写的元素的索引。缓冲区的位置从不为负值,也从不为负值

 

mark和reset:

标记是一个索引,通过Buffer中的mark()方法指定Buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position。

0<=mark<=position<=limit<=capacity;

 

clear: limit设置成capacity,position设置成0;一般在把数据写入Buffer前调用。

flip: limit设置成当前的位置position,并且把position设置成0;一般在从Buffer读出数据前调用。

rewind:limit保持不变,position设置成0。意思就是重新读一遍。一般在把数据重写入Buffer前调用。

 

你可能感兴趣的:(Java,SE,Netty深入浅出---实战)