Java NIO 之 Buffer緩衝區

2021-08-21 21:49:07 字數 1486 閱讀 6042

容量(capacity):緩衝區能夠容納的資料元素的最大數量。這一容量在緩衝區建立時被設定,並且永遠不能被改變 

上界(limit):緩衝區的第乙個不能被讀或寫的元素。或者說,緩衝區中現存元素的計數。(要是position已經到達limit的位置,此時再呼叫get()方法會報indexoutofbound***ception異常) 

位置(position):下乙個要被讀或寫的元素的索引。位置會自動由相應的 get( )和 put( )函式更新 

標記(mark):下乙個要被讀或寫的元素的索引。

*記住以下公式:

0 <= mark <= position <= limit <= capacity

一旦讀完buffer中的資料,需要讓buffer準備好再次被寫入。可以通過clear()或compact()方法來完成。

如果呼叫的是clear()方法,position將被設回0,limit被設定成 capacity的值。換句話說,buffer 被清空了。buffer中的資料並未清除,只是這些標記告訴我們可以從**開始往buffer裡寫資料。

如果buffer中有一些未讀的資料,呼叫clear()方法,資料將「被遺忘」,意味著不再有任何標記會告訴你哪些資料被讀過,哪些還沒有。

如果buffer中仍有未讀的資料,且後續還需要這些資料,但是此時想要先先寫些資料,那麼使用compact()方法。

compact()方法將所有未讀的資料拷貝到buffer起始處。然後將position設到最後乙個未讀元素正後面。limit屬性依然像clear()方法一樣,設定成capacity。現在buffer準備好寫資料了,但是不會覆蓋未讀的資料。

public static void main(string args)   

}

上述的程式將會持續輸出「你」字,並進入無窮迴圈。

可以使用equals()和compareto()方法兩個buffer。

equals()

當滿足下列條件時,表示兩個buffer相等:

有相同的型別(byte、char、int等)。

buffer中剩餘的byte、char等的個數相等。

buffer中所有剩餘的byte、char等都相同。

如你所見,equals只是比較buffer的一部分,不是每乙個在它裡面的元素都比較。實際上,它只比較buffer中的剩餘元素。

compareto()

compareto()方法比較兩個buffer的剩餘元素(byte、char等), 如果滿足下列條件,則認為乙個buffer「小於」另乙個buffer:

第乙個不相等的元素小於另乙個buffer中對應的元素 。

所有元素都相等,但第乙個buffer比另乙個先耗盡(第乙個buffer的元素個數比另乙個少)。(剩餘元素是從 position到limit之間的元素)

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緩衝區一些方法

flip 翻轉 我們已經寫滿了緩衝區,現在我們必須準備將其清空。我們想把這個緩衝區傳遞給乙個通道,以使內容能被全部寫出。但如果通道現在在緩衝區上執行get 那麼它將從我們剛剛插入的有用資料之外取出未定義資料。如果我們將位置值重新設為0,通道就會從正確位置開始獲取,但是它是怎樣知道何時到達我們所插入資...