JAVA中的Buffer


一、屬性
Buffer有四個基本屬性:
  1、capacity  容量,buffer能夠容納的最大元素數目,在Buffer創建時設定並不能更改
  2、limit buffer中有效位置數目,不能對超過limit中的區域進行讀寫。
  3、position 下一個讀或者寫的位置
  4、mark  用於記憶的標志位,配合reset()使用,初始值未設定,調用mark后將當前position設為值
四者關系:0 <= mark <= position <= limit <= capacity

 

2.直接與非直接緩沖區

  字節緩沖區要么是直接的,要么是非直接的。如果為直接字節緩沖區,則Java虛擬機會盡最大努力直接在此緩沖區上執行本機 I/O 操作。也就是說,在每次調用基礎操作系統的一個本機 I/O 操作之前(或之后),虛擬機都會盡量避免將緩沖區的內容復制到中間緩沖區中(或從中間緩沖區中復制內容)。

  直接字節緩沖區可以通過調用此類的allocateDireact()工廠方法來創建。此方法返回的緩沖區進行分配和取消分配所需成本通常高於非直接緩沖區。直接緩沖區的內容可以駐留在常規的垃圾回收堆之外,因此,它們對應用程序的內存需求量造成的影響可能並不明顯。所以,建議將直接緩沖區主要分配給那些易受基礎系統的本機 I/O 操作影響的大型、持久的緩沖區。一般情況下,最好僅在直接緩沖區能在程序性能方面帶來明顯好處時分配它們。

  直接字節緩沖區還可以通過mapping將文件區域直接映射到內存中來創建。Java平台的實現有助於通過JNI從本機代碼創建直接字節緩沖區。如果以上這些緩沖區中的某個緩沖區實例指的是不可訪問的內存區域,則試圖訪問該區域不會更改該緩沖區的內容,並且將會在訪問期間或稍后的某個時間導致拋出不確定的異常。

  字節緩沖區是直接緩沖區還是非直接緩沖區可通過調用其isDirect()方法來確定。提供此方法是為了能夠在性能關鍵型代碼中執行顯式緩沖區管理.二進制數據類定義了除 boolean 之外,讀寫所有其他基本類型值的方法。這些基本值可以根據緩沖區的當前字節順序與字節序列互相進行轉換,並可以通過order方法獲取和修改。特定的字節順序由 ByteOrder 類的實例表示。字節緩沖區的初始順序始終是 BIG_ENDIAN

  為了訪問異類二進制數據(即其他類型的值的序列),此類還針對每種類型定義了一系列絕對和相對的 get 和 put 方法。例如,對於 32 位浮點值,此類定義了以下方法:

 float  getFloat()
 float  getFloat(int index)
  void  putFloat(float f)
  void  putFloat(int index, float f)

  並針對 charshortintlongdouble 等類型定義了相應的方法。絕對 get 和 put 方法的 index 參數是根據字節定義的,而不是根據所讀寫的類型定義的。

  為了訪問同類二進制數據(即相同類型的值的序列),此類還定義了可以為指定類型的緩沖區創建視圖 的方法。視圖緩沖區 只是其內容受該字節緩沖區支持的另一種緩沖區。字節緩沖區內容的更改在視圖緩沖區中是可見的,反之亦然;這兩種緩沖區的位置、限制和標記值都是獨立的。例如,asFloatBuffer 方法將創建 FloatBuffer 類的一個實例,該類受在其上調用該方法的字節緩沖區的支持。該類將為 charshortintlongdouble 等類型定義相應的視圖創建方法。

與上述特定於類型的 get 和 put 方法系列相比,視圖緩沖區有以下三大主要優勢:

  • 視圖緩沖區不是根據字節進行索引,而是根據其特定於類型的值的大小進行索引;

  • 視圖緩沖區提供了相對批量 get 和 put 方法,這些方法可在緩沖區和數組或相同類型的其他緩沖區之間傳輸值的連續序列;

  • 視圖緩沖區可能更高效,這是因為,當且僅當其支持的字節緩沖區為直接緩沖區時它才是直接緩沖區。

視圖緩沖區的字節順序固定為創建該視圖時其字節緩沖區的字節順序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM