Java NIO 緩衝區(Buffer) 學習筆記
阿新 • • 發佈:2018-11-20
一、緩衝區(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()); } }