緩衝區與Buffer

在java新IO中,所有的操作都是以緩衝區進行的,既然使用了緩衝區,則操作的性能是最高的。


各種數據類型的緩衝區類(是以基本數據類型爲主的)

java.nio.ByteBuffer   //存儲字節的Buffer

java.nio.CharBuffer  //存儲字符的Buffer

java.nio.ShortBuffer  //存儲短整形的Buffer

java.nio.IntBuffer //存儲整形的Buffer

java.nio.LongBuffer  //存儲長整形的Buffer

java.nio.FloatBuffer  //存儲單精度浮點型的Buffer

java.nio.DoubleBuffer  //存儲雙精度浮點型的Buffer

他們都有直接的父類 -  java.nio.Buffer

爲甚麼沒有boolean類型的?因爲不需要緩衝操作的說。。


緩衝區操作主要是以 幾個變量爲準來完成操作的。

 position  、 limit 、 capacity(容量)


package buffdemo;
import java.nio.IntBuffer;

public class intBuffDemo01 {

	public static void main(String[] args) {
		IntBuffer buf = IntBuffer.allocate(10); //準備出10個大小的緩衝區
		System.out.println("1 、 寫入數據之前的 position limit 和capacity屬性");
		System.out.println("--> position = " + buf.position() + ", limit()" + buf.limit() 
		+ " , capacity  :  " + buf.capacity()		);
		
		int [] tmep = {1,5,7,9};
		buf.put(3);          //往緩衝區裏放入一個數據
		buf.put(tmep);		//往緩衝區裏放入一組數據
		
		System.out.println("2 、 寫入數據之後的 position limit 和capacity屬性");
		System.out.println("--> position = " + buf.position() + ", limit()" + buf.limit() 
		+ " , capacity  :  " + buf.capacity());
		
		
		buf.flip();  //重設緩衝區:重設後,position(指針變爲0,),limit=原來的position
		
		System.out.println("3、 準備輸出數據的 position limit 和capacity屬性");
		System.out.println("--> position = " + buf.position() + ", limit()" + buf.limit() 
		+ " , capacity  :  " + buf.capacity());
			
		
		while(buf.hasRemaining()){   //此方法判斷當前緩衝區的指針位置是否有數據,有則返回true,迭代輸出
			int x = buf.get();
			System.out.print(x + "、");
		}
	}
}

輸出結果:

1 、 寫入數據之前的 position limit 和capacity屬性
--> position = 0, limit()10 , capacity  :  10
2 、 寫入數據之後的 position limit 和capacity屬性
--> position = 5, limit()10 , capacity  :  10
3、 準備輸出數據的 position limit 和capacity屬性
--> position = 0, limit()5 , capacity  :  10
內容:
3、1、5、7、9、


深入緩衝區操作:

在Buffer中存在一系列的狀態變量,這些狀態變量隨着寫入或du讀取都有可能被改變,在緩衝區可以使用三個值表示緩衝區的狀態:

★ postiion :表示下一個緩衝區讀取或寫入的操作指針,每次向緩衝區寫入數據的時候指針就會改變,指針永遠放在寫入的最後一個元素之後。注:如果寫入4個位置的數據,則position會在第五個位置。

★ limit : 表示還有多謝數據需要存儲或讀取,positon<=limit

★ capacity :表示緩衝區的最大容量,limit<=capacity:表示緩衝區的最大容量,此值在分配緩衝區時被設置,一般不會更改。



slice();方法可以返回一個子緩衝區,使用這個的話得設置好 limit和position 



修改 position 和 limit劃分子緩衝區 

子緩衝區和緩衝區共享數據,所以當子緩衝區發生變化時,主緩衝區也一併改變了。


如果希望創建的緩衝區不希望被修改,則可以創建只讀緩衝區

代碼: InteBuffer sub = buf.asReadyOnlyBuffer();

package buffdemo;
import java.nio.IntBuffer;

public class intBuffDemo02 {

	public static void main(String[] args) {
		IntBuffer buf = IntBuffer.allocate(10); //準備出10個大小的緩衝區
		IntBuffer sub = null;
		
		for(int i=0;i<10;i++){
			buf.put(i * 2 + 1);
		}
		sub = buf.asReadOnlyBuffer();  //創建只讀緩衝區
		
		sub.flip();  //把只讀緩衝區的指針重置
		//此處操作根據filp()的特性進行了重置position=0,limit=2(原來的position大小)
		System.out.println("子緩衝區的內容");
		
		while(sub.hasRemaining()){   //此方法判斷當前緩衝區的指針位置是否有數據,有則返回true,迭代輸出
			int x = sub.get();
			System.out.print(x + "、");
		}
		
		sub.put(7,30); //錯誤 ,只讀緩衝區不能被修改
	}
}



直接緩衝區 : allocateDirect(int capacity)  在ByteBuffer 類中的一個方法返回:

操作方法和第一個相同,當性能更高,因爲當創建此種緩衝區的時候,JVM會儘可能的完成任務。


總結:

1、NIO都是以緩衝區進行操作的

2、緩衝區都是針對基本數據類型實現的,除了boolean除外

3、緩衝區中存在postiion 、limit、capacity三個狀態變量

4、緩衝區操作中通過方法 allocate()創建緩衝區,或使用只讀、直接緩衝區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章