一直對IO、NIO很懵逼,特意在網上又找了一點兒視頻看看,在學習一下,寫下來在鞏固鞏固(手動滑稽)
如有錯誤,請及時聯繫我更正,萬分感謝!
首先看一下使用到是三個屬性
position 當前下標
limit 可用大小
capacity 總大小
使用allocate()創建緩衝區。
先看一下代碼。
public static void test1() {
/***
* position 當前位置
* limit 可使用
* capacity 總共
*/
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
System.out.println(byteBuffer.position()); // 0
System.out.println(byteBuffer.limit()); // 1024
System.out.println(byteBuffer.capacity()); // 1024
System.out.println("------------開始存放------------");
byteBuffer.put("abcdefg".getBytes());
System.out.println(byteBuffer.position()); // 7
System.out.println(byteBuffer.limit()); // 1024
System.out.println(byteBuffer.capacity()); // 1024
System.out.println("------------開始讀取------------");
byteBuffer.flip();
byte[] b = new byte[byteBuffer.limit()];
byteBuffer.get(b);
String string = new String(b, 0, b.length);
System.out.println("讀取到的數據爲:" + string);
System.out.println(byteBuffer.position()); // 7
System.out.println(byteBuffer.limit()); // 7
System.out.println(byteBuffer.capacity()); // 1024
System.out.println("------------再次讀取------------");
byteBuffer.rewind();
byte[] b2 = new byte[byteBuffer.limit()];
byteBuffer.get(b);
String s2 = new String(b2, 0, b.length);
System.out.println("讀取到的數據爲:" + s2);
System.out.println(byteBuffer.position()); // 7
System.out.println(byteBuffer.limit()); // 7
System.out.println(byteBuffer.capacity()); // 1024
System.out.println("-----------清空緩衝區-------------");
byteBuffer.clear();
System.out.println("讀取到的數據爲:" + s2);
System.out.println(byteBuffer.position()); // 0
System.out.println(byteBuffer.limit()); // 1024
System.out.println(byteBuffer.capacity()); // 1024
}
0
1024
1024
------------開始存放------------
7
1024
1024
------------開始讀取------------
讀取到的數據爲:abcdefg
7
7
1024
------------再次讀取------------
讀取到的數據爲:
7
7
1024
-----------清空緩衝區-------------
讀取到的數據爲:
0
1024
1024
看一下對應的結果。當使用allocate()方法創建緩衝區的時候,此時byteBuffer的三個屬性已經確認。
當開始往緩衝區放入數據後,下標(position)會更改,這個時候相當於佔位。
此時可以看到,position已經更改了位置,但是爲什麼limit還是不變呢?是因爲前面的這幾個還是能用的,並不是不能用。
然後使用
byteBuffer.flip();
進行將下標變爲0。使用get()讀取
limit變成了和position一樣,我是這樣理解的。是從之前position加上此次讀取的長度。
而position是和
byte[] b = new byte[byteBuffer.limit()];
裏面的new byte[]裏面的數有關係。
然後使用再次
byteBuffer.rewind();
進行再次讀取,此時也可以使用
byteBuffer.flip();
這兩個方法的區別是flip是從0開始讀取,而rewind是重複上一次讀取的。