java NIO Buffer常用方法

一、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初始化状态

java NIO Buffer常用方法_第1张图片

插入hello之后的状态

java NIO Buffer常用方法_第2张图片

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

java NIO Buffer常用方法_第3张图片

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

clear状态:position=mark,limit=capacity

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

三、常见方法的使用

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

package buffer;

import java.nio.ByteBuffer;
//position返回0的位置。其实是返回到mark标记处的位置,而mark是可以改变的
public class TestBuffer {

	public static void main(String[] args) {
		// 定义一个Buffer
		ByteBuffer buffer = defineBuffer();
		//放入数据,读取数据,截取buffer
		testBufferMethod(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为de
		buffer = 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());//10
		System.out.println(buffer.limit());//10
		return buffer;
	}
}






你可能感兴趣的:(java,NIO(中文版))