**
flip()翻轉
我們已經寫滿了緩衝區,現在我們必須準備將其清空。我們想把這個緩衝區傳遞給乙個通道,以使內容能被全部寫出。但如果通道現在在緩衝區上執行get(),那麼它將從我們剛剛插入的有用資料之外取出未定義資料。如果我們將位置值重新設為0,通道就會從正確位置開始獲取,但是它是怎樣知道何時到達我們所插入資料末端的呢?這就是上界屬性被引入的目的。上界屬性指明了緩衝區有效內容的末端。我們需要將上界屬性設定為當前位置,然後將位置重置為0。我們可以人工用下面的**實現: buffer.limit(buffer.position()).position(0); 但這種從填充到釋放狀態的緩衝區翻轉是api設計者預先設計好的,他們為我們提供了乙個非常便利的函式: buffer.flip(); flip()函式將乙個能夠繼續新增資料元素的填充狀態的緩衝區翻轉成乙個準備讀出元素的釋放狀態。比如:
我們定義乙個容量為10的位元組緩衝區,這裡它有乙個上界limit和當前位置position,limit這時的大小是10,假如我們這時加入3個數字,這時position位置指向4,這時你如果想讀資料的話,使用這個方法後,position變為0,而limit變為4
rewind()
與flip()相似,但不影響上界屬性。它只是將位置值設回0。您可以使用rewind()後退,重讀已經被翻轉的緩衝區中的資料。
hasremaining()
布林函式會在釋放緩衝區時告訴您是否已經達到緩衝區的上界。以下是一種將資料元素從緩衝區釋放到乙個陣列的方法
for (int i = 0; buffer.hasremaining( ), i++)
作為選擇,remaining()函式將告知您從當前位置到上界還剩餘的元素數目
int count = buffer.remaining( );
for (int i = 0; i < count, i++)
clear()
clear()函式將緩衝區重置為空狀態。它並不改變緩衝區中的任何資料元素,而是僅僅將上界設為容量的值,並把位置設回0
壓縮compact()
有時,您可能只想從緩衝區中釋放一部分資料,而不是全部,然後重新填充。為了實現這一點,未讀的資料元素需要下移以使第乙個元素索引為0。儘管重複這樣做會效率低下,但這有時非常必要,而api對此為您提供了乙個compact()函式。這一緩衝區工具在複製資料時要比您使用get()和put()函式高效得多還要注意的是,位置已經被設為被複製的資料元素的數目。也就是說,緩衝區現在被定位在緩衝區中最後乙個「存活」元素後插入資料的位置。最後,上界屬性被設定為容量的值,因此緩衝區可以被再次填滿。呼叫compact()的作用是丟棄已經釋放的資料,保留未釋放的資料,並使緩衝區對重新填充容量準備就緒
JAVA NIO系列(三) Buffer 解讀
nio中的buffer用於和通道互動,資料是從通道讀入緩衝區,從緩衝區中寫入通道的。buffer就像乙個陣列,可以儲存多個型別相同的資料。每種基本資料型別都有對應的buffer類 1 capacity 容量 buffer本質是乙個陣列,在初始化時有固定的大小,這個值就是容量。容量不可改變,一旦緩衝區...
Java NIO 三 緩衝區Buffer
緩衝區本質上是一塊可以寫入資料,然後可以從中讀取資料的記憶體。這塊記憶體被包裝成nio buffer物件,並提供了一組方法,用來方便的訪問該塊記憶體。capacity capacity代表著buffer的固定大小值,能存放的最大值不超過capacity。position limit mark buf...
Java NIO 之 Buffer緩衝區
容量 capacity 緩衝區能夠容納的資料元素的最大數量。這一容量在緩衝區建立時被設定,並且永遠不能被改變 上界 limit 緩衝區的第乙個不能被讀或寫的元素。或者說,緩衝區中現存元素的計數。要是position已經到達limit的位置,此時再呼叫get 方法會報indexoutofbound c...