1. 程式人生 > >Java NIO 緩衝區(Buffer) 學習筆記

Java NIO 緩衝區(Buffer) 學習筆記

  一、緩衝區(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 testBuffer(){
		
		String str = "hello world!";
		
		//1. 分配一個指定大小的非直接緩衝區
		ByteBuffer buff = ByteBuffer.allocate(1024);
		
		// 分配直接緩衝區
		ByteBuffer buf = ByteBuffer.allocateDirect(1024); 
		System.out.println(buf.isDirect());
		
		//2. 利用 put() 存入資料到緩衝區中
		buff.put(str.getBytes());
		System.out.println(buff.position());
		System.out.println(buff.capacity());
		System.out.println(buff.limit()); 
		
		//3. flip() 切換讀取資料模式
		buff.flip();
		System.out.println(buff.position());
		
		//4. mark() : 標記
		buff.mark();
		
		//5. 利用 get() 讀取緩衝區中的資料
		byte[] dst = new byte[buff.limit()];
		buff.get(dst,0,5);
		System.out.println(buff.position());
		
		//6. reset() : 恢復到 mark 的位置
		buff.reset();
		
		//7. rewind() : 可重複讀
		buff.rewind();
		
		//8. clear() : 清空緩衝區. 但是緩衝區中的資料依然存在,但是處於“被遺忘”狀態
		buff.clear();
				
		//9. hasRemaining()判斷緩衝區中是否還有剩餘資料
		if(buff.hasRemaining()){
			//10. remaining()獲取緩衝區中可以操作的數量
			System.out.println(buff.remaining());
		}
		
	}