java NIO Buffer常用方法

来源:互联网 发布:淘宝开店类目如何选择 编辑:程序博客网 时间:2024/05/24 06:57

一、Buffer简介

1、Buffer是被用来当缓冲区使用的小部分内存,有七个子类ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer ,分别用来存储不同的数据类型。

2、Buffer的核心属性。如ByteBuffer按字节(8位)的方式存储数据,若存储字符(java按unicode字符16位)则高八位将会被截取。

假如定义一个ByteBuffer

mark:定义缓冲区后,存储数据的初始位置,默认为0

position:存储或者读取到的数据的当前位置,下一个数据将从该position处后面的一个字节开始存储。

limit:缓冲区中数据的有效位置,默认和容量一样。

capacity:初始容量。

二、图形分析

ByteBuffer初始化状态


插入hello之后的状态


flip之后的状态,读就绪状态


缓冲区是否相等,重写的compareTo方法,通过有效数据的字节挨个比较得出的

clear状态:position=mark,limit=capacity

compact状态:舍弃读取过的内容后,mark=position,position = 0;limit=capacity.

三、常见方法的使用

buffer常与channel联合使用,这里只介绍常用方法。

<span style="font-family:KaiTi_GB2312;">package buffer;import java.nio.ByteBuffer;//position返回0的位置。其实是返回到mark标记处的位置,而mark是可以改变的public class TestBuffer {public static void main(String[] args) {// 定义一个BufferByteBuffer buffer = defineBuffer();//放入数据,读取数据,截取buffertestBufferMethod(buffer);}public static void testBufferMethod(ByteBuffer buffer) {buffer.put("abcdefg".getBytes());System.out.println(buffer.position());//此时position位置为7,下个数据将放在8的位置//读取buffer的数据必须用flip方法。flip方法时position为0,limit为8.读取数据仍然从position开始//limit表示position到limit之间的有效数据buffer.flip();while(buffer.hasRemaining()) { //如果还有就继续读取System.out.print((char)buffer.get());//读取有效数据abcdefg}System.out.println("\n" + buffer.position());//7,读取的过程中position再次移动到了7的位置//clear方法,并未真的清空缓冲区,而是是position为0,limit为capacity。是buffer处于写状态,写入数据时//里面存在的数据将会被覆盖。而compact是舍弃position前面的数据,然后将position的位置顶置为0,limit的位置capacity,//然后再在内容的后面追加内容//复制一个缓冲区buffer.position(3).limit(5);//3,4为debuffer = buffer.slice();while(buffer.hasRemaining()) { System.out.print((char)buffer.get());//de}}public static ByteBuffer defineBuffer() {// ByteBuffer buffer = ByteBuffer.allocate(10);byte[] array = new byte[10];ByteBuffer buffer = ByteBuffer.wrap(array);// 定义初始容量为10的字节缓冲区System.out.println(buffer.mark()); //java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]System.out.println(buffer.position());//0,此时没有内容System.out.println(buffer.capacity());//10System.out.println(buffer.limit());//10return buffer;}}</span>






1 0
原创粉丝点击