java nio.Buffer的属性变化
生活随笔
收集整理的這篇文章主要介紹了
java nio.Buffer的属性变化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
java nio.Buffer的屬性變化
認識Buffer
Channel 提供從文件、網絡讀取數據的渠道,但是讀取或寫入的數據都必須經由 Buffer。Buffer,實際上是一個連續數組。
常用的 Buffer 的子類有:ByteBuffer、IntBuffer、 CharBuffer、 LongBuffer、 DoubleBuffer、FloatBuffer、ShortBuffer。
所有緩沖區都有4個屬性:capacity、limit、position、mark。
- Capacity 容量,即可以容納的最大數據量;在緩沖區創建時被設定并且不能改變
- Limit 表示緩沖區的當前終點,不能對緩沖區超過極限的位置進行讀寫操作。且極限是可以修改的
- Position 位置,下一個要被讀或寫的元素的索引,每次讀寫緩沖區數據時都會改變改值,為下次讀寫作準備
- Mark 標記,調用mark()來設置mark=position,再調用reset()可以讓position恢復到標記的位置
Buffer的核心屬性
下面為Buffer中重要的屬性
// Invariants: mark <= position <= limit <= capacity private int mark = -1; private int position = 0; private int limit; private int capacity;Buffer的屬性變化
代碼
ByteBuffer byteBuffer = ByteBuffer.allocate(1024); ByteBuffer byteBuffer2 = ByteBuffer.wrap(new String("12345").getBytes());System.out.println("******************** b1和b2的初始值對比 ********************"); System.out.println("byteBuffer == "+byteBuffer); System.out.println("byteBuffer2 == "+byteBuffer2);System.out.println("********************** flip()的作用 *******************"); String str = "123456789"; byteBuffer.put(str.getBytes()); System.out.println("byteBuffer flip()前 == "+byteBuffer); byteBuffer.flip(); System.out.println("byteBuffer flip()后 == "+byteBuffer);System.out.println("******************** clear()的作用 ********************"); System.out.println("byteBuffer clear()前 == "+byteBuffer); byteBuffer.clear(); System.out.println("byteBuffer clear()后 == "+byteBuffer);結果
******************** b1和b2的初始值對比 ******************** byteBuffer == java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024] byteBuffer2 == java.nio.HeapByteBuffer[pos=0 lim=5 cap=5] ********************** flip()的作用 ******************* byteBuffer flip()前 == java.nio.HeapByteBuffer[pos=9 lim=1024 cap=1024] byteBuffer flip()后 == java.nio.HeapByteBuffer[pos=0 lim=9 cap=1024] ******************** clear()的作用 ******************** byteBuffer clear()前 == java.nio.HeapByteBuffer[pos=0 lim=9 cap=1024] byteBuffer clear()后 == java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]flip()和clear()的作用
代碼
System.out.println("************* 沒使用flip()和clear()帶來的問題 **************"); String str2 = "123456789"; String str3 = "abc"; byteBuffer.put(str2.getBytes()); System.out.println("從buffer中讀取數據 == "+new String(byteBuffer.array())); byteBuffer.put(str3.getBytes()); System.out.println("從buffer中讀取數據 == "+new String(byteBuffer.array()));byteBuffer.clear(); System.out.println("************* 使用flip()和clear()和limit()解決重復讀問題**************"); String str4 = "123456789"; String str5 = "abc";byteBuffer.put(str4.getBytes()); byteBuffer.flip(); byte[] tem = new byte[byteBuffer.limit()]; byteBuffer.get(tem); System.out.println("從buffer中讀取數據 == "+new String(tem)); byteBuffer.clear();byteBuffer.put(str5.getBytes()); byteBuffer.flip(); tem = new byte[byteBuffer.limit()]; byteBuffer.get(tem); System.out.println("從buffer中讀取數據 == "+new String(tem)); byteBuffer.clear();結果
************* 沒使用flip()和clear()帶來的問題 ************** 從buffer中讀取數據 == 123456789 從buffer中讀取數據 == 123456789abc ************* 使用flip()和clear()和limit()解決重復讀問題************** 從buffer中讀取數據 == 123456789 從buffer中讀取數據 == abc總結
以上是生活随笔為你收集整理的java nio.Buffer的属性变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝牙移动音箱连接器大解剖移动音响蓝牙连接
- 下一篇: 零拷贝和java NIO