Java NIO-之緩衝區Buffer

	
	import java.nio.ByteBuffer;
	
	
	import org.junit.Test;
	
	
	public class Nio01 {
	/*
	* 一、緩衝區(Buffer):在 Java NIO 中負責數據的存取。緩衝區就是數組。用於存儲不同數據類型的數據
	* 
	* 根據數據類型不同(boolean 除外),提供了相應類型的緩衝區:
	* ByteBuffer
	* CharBuffer
	* ShortBuffer
	* IntBuffer
	* LongBuffer
	* FloatBuffer
	* DoubleBuffer
	* 
	* 上述緩衝區的管理方式幾乎一致,通過 allocate() 獲取緩衝區
	* 
	* 二、緩衝區存取數據的兩個核心方法:
	* put() : 存入數據到緩衝區中
	* get() : 獲取緩衝區中的數據
	* 
	* 三、緩衝區中的四個核心屬性:
	* capacity : 容量,表示緩衝區中最大存儲數據的容量。一旦聲明不能改變。
	* limit : 界限,表示緩衝區中可以操作數據的大小。(limit 後數據不能進行讀寫)
	* position : 位置,表示緩衝區中正在操作數據的位置。
	* 
	* mark : 標記,表示記錄當前 position 的位置。可以通過 reset() 恢復到 mark 的位置
	* 
	* 0 <= mark <= position <= limit <= capacity
	* 
	* 四、直接緩衝區與非直接緩衝區:
	* 非直接緩衝區:通過 allocate() 方法分配緩衝區,將緩衝區建立在 JVM 的內存中
	* 直接緩衝區:通過 allocateDirect() 方法分配直接緩衝區,將緩衝區建立在物理內存中。可以提高效率
	*/
	@Test
	public void test03(){
	//創建直接緩衝區
	ByteBuffer bff=ByteBuffer.allocateDirect(1024);
	System.out.println(bff.position());
	}
	
	@Test
	public void test02(){
	String str="sdsaffffffffffffff";
	//非直接緩衝區
	ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
	byteBuffer.put(str.getBytes());
	byteBuffer.flip();
	byte[] ba=new byte[byteBuffer.limit()];
	byteBuffer.get(ba,0,2);
	System.out.println(new String(ba, 0, 2));
	
	//標記
	byteBuffer.mark();
	byteBuffer.get(ba,2,4);
	System.out.println(new String(ba, 2, 4));
	//恢復 到mark的位置
	byteBuffer.reset();
	System.out.println(byteBuffer.position());
	}
	@Test
	public void test01(){
	String str="ds1.///[}/?s45465ss436suyj/l;ss765sss2312sssdasfdsgfdhfhtryh34t64weg";
	//分配緩衝區大小 直接緩衝區
	ByteBuffer buf=ByteBuffer.allocate(1024);
	System.out.println(buf.position());
	System.out.println(buf.limit());
	System.out.println(buf.capacity());
	
	//數據放置到緩存區
	buf.put(str.getBytes());
	System.out.println(buf.position());
	System.out.println(buf.limit());
	System.out.println(buf.capacity());
	
	
	//切換讀取數據的模式
	buf.flip();
	System.out.println(buf.position());
	System.out.println(buf.limit());
	System.out.println(buf.capacity());
	
	//讀取數據
	byte[] bat=new byte[buf.limit()];
	buf.get(bat);
	System.out.println(new String(bat,0,bat.length));
	System.out.println(buf.position());
	System.out.println(buf.limit());
	System.out.println(buf.capacity());
	
	//可重複讀取
	buf.rewind();
	System.out.println(buf.position());
	System.out.println(buf.limit());
	System.out.println(buf.capacity());
	
		//清空緩衝區 但是緩衝區中的數據依然存在,但是處於“被遺忘”狀態
	buf.clear();
	System.out.println(buf.position());
	System.out.println(buf.limit());
	System.out.println(buf.capacity());
	}
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章