在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()創建緩衝區,或使用只讀、直接緩衝區。