JAVA NIO之Buffer(一)

来源:互联网 发布:御彩轩计划软件下载 编辑:程序博客网 时间:2024/05/17 22:40

1.Buffer是一个原始类型的数据容器,是一个特定原始类型的线性有限序列。除了它的内容外,最基本的属性有:capacity,limit,position,这三个属性的含义如下:

1)capacity: buffer包含数据元素的个数(int类型,非负,大小固定不变)

2)limit: limit指定的元素是第一个不能被读或者写的元素(int类型,非负,它的值不会超过capacity)

3)position: position指定的下一个元素可以被读或者写(int类型,非负,它的值不会超过limit)

4)三者之间的不变关系是:0 <= mark <= position <= limit <= capacity

2. 除了boolean类型外,其他基本数据类型的Buffer(ByteBuffer,ShortBuffer,CharBuffer,IntBuffer,LongBuffer,
FloatBuffer,DoubleBuffer)都是Buffer的子类。

3.相对操作读写一个或多个数据元素从当前位置(position)开始,position数值的大小随着转移数据的数量而增加。如果请求转移的数据超过了limt,然后执行get()方法时将会得到一个BufferUnderflowException,如果此时执行put()操作,将会得到一个BufferOverflowException,在任何一种情况下,没有数据会被转移。

4.采用明确的索引方式的绝对操作,不会影响position的大小,如果采用绝对操作执行get,put方法时下标参数超过了limit,将会得到一个IndexOutOfBoundsException

5.数据可以通过I/O操作,从当前位置开始来移进或者移出一个合适的缓冲区。

6.Marking and resetting

1)当调用rest方法时,postion会移动到mark标记的位置。(前提是必须先定义mark)

2)mark不会经常使用,一旦使用的话,它的大小是非负的,并且不会超过position

3)当position或者limit小于mark的大小时,mark会被丢弃掉即mark是无效的。

4)如果mark没有定义,当调用reset方法时,会得到一个InvalidMarkException

5)新建的Buffer,position等于0,mark未定义,limit的值可能是0也可能是是他的值,这个取决于buffer的类型和构造buffer的方式。新分配的缓冲区的每一个元素会被初始化为0

7. Clearing, flipping, and rewinding

1)clear: 使一个缓冲区为一个新序列的channel-read或者一个相对的put操作做准备:position重置为0,limit重置为capacity

2)flip: 使一个缓冲区为一个新序列的channel-write或者一个相对的get操作做准备:limit重置为position的位置,position重置为0

3)rewind: 使缓冲区的数据可以重复读:position的位置重置为0,limit位置不变。

8. 所有的Buffer都是可读的,但并非所有的Buffer都是可写的,所有buffer类里面的可变方法都被指定为可选择的操作,当在一个只读的Buffer上面调用写操作时,会得到一个ReadOnlyBufferException。一个只读的缓冲区不允许修改

它的内容,但是mark,pisition,limit的值是可以更改的,无论一个Buffer是不是只读的,可以通过调用它的isReadOnly方法来判断。

9. 所有的Buffer在多线程环境下,都是线程不安全的,如果一个buffer用在多线程环境下,需要采取一定的同步机制。

10. Buffer类里面的方法的调用方式有以下两种:

1)  b.flip();

b.position(23);

b.limit(42);

2)b.flip().position(23).limit(42);

0 0
原创粉丝点击