NIO BUFFER

Buffer

I/O緩衝區操作簡圖:
image

兩個概念:用戶空間和內核空間

用戶空間: 是常規進程所在區域,JVM就是常規進程,駐守於用戶空間,用戶空間爲非特權區域(不能直接訪問硬件設備)。

內核空間: 是指操作系統所在區域,內核代碼有特別的權利(能與設備控制器通訊,控制着用戶空間進程的運行狀態等等,最重要的是,所有的IO都直接或間接的通過內核空間)。

注:計算機磁盤是基於塊存儲的硬件設備,也就是說,它操作的是固定大小的數據塊,而用戶進程請求的可能是任意大小的或非對齊的數據塊。在數據往來於用戶空間與存儲設備的過程中,內核負責
數據的分解、再組合工作,因此充當着中間人的角色。
一個Buffer對象是固定數量的數據的容器,它其實就是一個存儲器,類似於List或數組。這裏的數據可被存儲並在之後用於檢索。
每個非布爾的原始基本類型都有對應的緩衝區類(Buffer)。儘管緩衝區類保存的是原始數據類型,但是它更傾向於操作字節處理。

Buffer繼承類圖如下:

image

屬性:

所有的緩衝區都有4個屬性來提供它所包含的數據元素的信息:
- 容量(Capactiy):緩衝區能夠容納數據元素的最大數量,它在緩衝區創建時被設定,並且一旦設定不能被改變。
- 上界(Limit):緩衝區現存元素的數量。
- 位置(Position):下一個元素的索引,位置由get()或者put()方法自動更新。
- 標記(Mark):一個備忘位置,在設定它之前爲(-1)。mark()設定mark = position | reset()設定position = mark

這四個屬性總是以下關係:
0 <= mark <= position <= limit <= capacity

創建緩衝區類

創建緩衝區類有兩種方式:
  • 通過申請空間的方式創建:
ByteBuffer buffer = ByteBuffer.allocate(100);
  • 通過包裝方式創建:
byte[] buf = new byte[100];
ByteBuffer buffer = ByteBuffer.wrap(buf);

ByteBuffer buffer = ByteBuffer.wrap(buf, 2,8);

上述兩種創建方式中,第一種爲ByteBuffer內部自建一個私有數組進行緩衝,數組創建在堆內存上。第二種又有兩種方式,不過都需要自創建一個數組,作爲數據備份數組,當我們給Buffer填充值以後,同時我們自建的數組中也可以訪問到值了。
*.wrap(buf,int offset,limit)表示傳入一個數組buf,從offset位置傳值,定點臨界值爲limit,此時Buffer的capacity的值爲:offset+limit

當寫完Buffer後,需要讀Buffer時,必須調用flip()方法,該方法是將寫模式切換爲讀模式,並且將position置爲0,limit置爲寫模式時的position,以便能正確的讀取到數據。

注:limit不能超過buf.length,否則報錯
put值時,position小於offset除非顯示指定,否則報錯。
put(E e), put(int position, E e)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章