前言:
Java NIO全程 java non-blocking IO,JDK提供的新API,從JDK1.4開始,Java提供了一系列改進的輸入/輸出的新特性,被統稱為NIO,是同步非阻塞的IO。
Buffer緩衝區緩衝區(buffer),它是記憶體空間的一部分。在記憶體空間中預留的一定儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區,具有一定的大小。
區別.ByteBuffer.allocate()和ByteBuffer.allocateDirect()
ByteBuffer.allocate()分配到JVM內;
ByteBuffer.allocateDirect()分配到JVM外,即方法區(元資料區);
Buffer類定義了緩衝區都具有的四個屬性:
1、mark,標記;
2、position,位置,下一個要被讀寫的元素的索引,每次讀取緩衝區資料都會改變該值,為下次讀寫做準備;
3、limit,表示緩衝區的當前終點,不能對緩衝區超過極限的位置進行讀寫操作;
4、capacity,容量,即可以容納的最大資料量。在緩衝區被建立時被設定並且不能修改;
Buffer及其子類
存取Buffer緩衝區資料的核心方法:
1、put():存入資料到緩衝區中。
2、get():獲取緩衝區中的資料。
3、flip():讀寫切換。
5、mark():儲存當前position的位置。
6、reset():把當前的position重置為mark的值。
7、rewind():重讀操作,position置0。
程式碼案例1:import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.charset.Charset;public class StringTransforByteBufferDemo { public static void main(String[] args) { Charset charset = Charset.forName("GBK"); String text = "將字元轉為位元組(編碼)"; // String轉為ByteBuffer ByteBuffer byteBuf = ByteBuffer.wrap(text.getBytes(charset)); System.out.println(byteBuf.capacity()); // 翻轉 // byteBuf.flip(); // ByteBuffer轉為String CharBuffer charBuffer = null; try { charBuffer = charset.decode(byteBuf); // charBuffer = charset.newDecoder().decode(byteBuf); } catch (Exception e) { e.printStackTrace(); } System.out.println("字串:" + charBuffer.toString()); }}
import java.nio.ByteBuffer;public class BufferDemo { public static void main(String[] args) { String str = "abcde"; ByteBuffer buf = ByteBuffer.allocate(1024); byte[] bytes = new byte[10]; buf.put(str.getBytes()); // 切換到讀模式 buf.flip(); // 獲取buf的兩個位元組 buf.get(bytes, 0, 2); System.out.println(new String(bytes)); // 標記position的位置 buf.mark(); // 獲取buf的兩個位元組 buf.get(bytes, 2, 2); System.out.println(new String(bytes)); System.out.println(buf.position()); // 回到position=2的位置 buf.reset(); System.out.println(buf.position()); }}
程式碼案例2:
import java.nio.ByteBuffer;public class BufferDemo2 { public static void main(String[] args) { String str = "abcde"; //宣告一個Byte緩衝區(非直接緩衝區),並設定緩衝區大小為1024 ByteBuffer buf = ByteBuffer.allocate(1024); //直接緩衝區申請方式 //ByteBuffer.allocateDirect(1024); System.out.println("-------------------------allocate------------------------"); //0 System.out.println(buf.position()); //1024 System.out.println(buf.limit()); //1024 System.out.println(buf.capacity()); System.out.println("-------------------------put------------------------"); //把str的資料放入緩衝區 buf.put(str.getBytes()); //5 System.out.println(buf.position()); //1024 System.out.println(buf.limit()); //1024 System.out.println(buf.capacity()); //3.切換讀取資料模式 buf.flip(); System.out.println("-------------------------get------------------------"); byte[] bytes = new byte[20]; //讀取緩衝區理的5個位元組 buf.get(bytes,0, buf.limit()); //5,表示資料讀到的位置 System.out.println(buf.position()); //5.表示可以讀的位置 System.out.println(buf.limit()); System.out.println(buf.capacity()); //5. rewind: 可重讀 buf.rewind(); System.out.println("-------------------------rewind------------------------"); //position回到0 System.out.println(buf.position()); //5.表示可以讀的位置,5 System.out.println(buf.limit()); System.out.println(buf.capacity()); //clear(): 清空快取區,但資料任然存在,只是把position和limit重置為最初狀態。 buf.clear(); System.out.println("-------------------------clear------------------------"); //postion變為0 System.out.println(buf.position()); //1024 System.out.println(buf.limit()); System.out.println(buf.capacity()); } }