(1)、java.io中最为核心的一个概念是流(stream) ,面向流的编程。
(2)、Java中,一个流要么是输入流,要么是输出流,不可能同时既是输入流又是输出流。
(3)、java.nio中拥有3个核心概念: selector,Channel与Buffer。
关系如下:
(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系统中,底层操作系统的通道就是双向的。
(1)、capacity:缓冲区的容量,是Buffer它包含的元素数量。缓冲区的容量从不为负值,也从不改变。
(2)、limit:缓冲区的limit是第一个不被读或写的元素的索引。缓冲区的limit从不为负,也从不为负,
也从不大于它的容量(capacity)。
(3)、position:缓冲区的位置是下一个要被读或写的元素的索引。缓冲区的位置从不为负值,也从不为负值
标记是一个索引,通过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前调用。