首頁>技術>

前言:

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());	}	}

16
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Haskell的魔法 - 函數語言程式設計初探之一