Java NiO 緩衝區學習筆記
一、緩衝區(Buffer):在 Java NIO 中負責資料的存取。緩衝區就是陣列。用於儲存不同資料型別的資料
根據資料型別不同(boolean 除外),提供了相應型別的緩衝區: ByteBuffer、 CharBuffer、ShortBuffer、 IntBuffer、 LongBuffer、FloatBuffer、 DoubleBuffer
上述緩衝區的管理方式幾乎一致,通過 allocate() 獲取緩衝區,如 ByteBuffer.allocate(1024);
二、 緩衝區存取資料 核心方法 put() 存入資料到緩衝區中 ;get() 獲取緩衝區中的資料
三、緩衝區的核心屬性:
capatity 容量 緩衝區最大儲存資料容量,一旦宣告不能改變 ;
limit:界限,表示緩衝區可以操作資料的大小(limit後資料不能進行讀寫)
position 位置,表示緩衝區正在操作資料的位置
mark :標記 表示記錄當前 position 的位置。可以通過 reset() 恢復到 mark 的位置
四、直接緩衝區與非直接緩衝區:
非直接緩衝區:通過 allocate() 方法分配緩衝區,將緩衝區建立在 JVM 的記憶體中
直接緩衝區:通過 allocateDirect() 方法分配直接緩衝區,將緩衝區建立在實體記憶體中。可以提高效率
程式碼例項
public void test1(){
String str="abcde";
//分配指定大小的緩衝區
ByteBuffer buf=ByteBuffer.allocate(1024);
System.out.println("");
//存資料
buf.put(str.getBytes());
System.out.println("put");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//切換讀資料模式
buf.flip();
//利用get讀取緩衝區資料
byte[] dst=new byte[buf.limit()];
buf.get(dst);
System.out.println(new String(dst,0,dst.length));
System.out.println("get");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//rewind 可重複讀
buf.rewind();
System.out.println("rewind");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//clear 清空緩衝區,但是緩衝區資料依然存在
buf.clear();
System.out.println("clear");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
}
public void test2(){
String str="abcde";
ByteBuffer buf=ByteBuffer.allocate(1024);
buf.put(str.getBytes());
//切換讀模式
buf.flip();
byte[] bst=new byte[buf.limit()];
buf.get(bst,0,2);
System.out.println(new String(bst,0,2));
System.out.println(buf.position());
//mark標記
buf.mark();
buf.get(bst,2,2);
System.out.println(new String(bst,2,2));
System.out.println(buf.position());
//reset :恢復到mark的位置
buf.reset();
System.out.println(buf.position());
}