【Java 网络编程】NIO Buffer 简介 ( 概念 | 数据传输 | 标记 | 位置 | 限制 | 容量 | 标记 | 重置 | 清除 | 翻转 | 重绕 | 链式操作 )
文章目錄
- I. Buffer 簡介
- II. Buffer 屬性
- III. Buffer 數據讀寫
- IV. Buffer 標記 mark() 和重置 reset()
- V. Buffer 清除 翻轉 重繞
- VI. Buffer 緩沖區只讀屬性
- VII. Buffer 的鏈式調用
I. Buffer 簡介
Buffer 是在 NIO 中定義的抽象類 , 其針對七種基本數據類型都有對應的實現類 , 如 ByteBuffer , CharBuffer , DoubleBuffer , FloatBuffer , IntBuffer , LongBuffer , ShortBuffer ; 其是用于緩存基本數據類型的容器 ;
Buffer 作用 : 在內存中創建指定大小的空間 , 對一些基本類型數據進行緩存 ; 使用緩存能減少讀寫磁盤的次數 , 這塊緩存所占用的內存會一直使用 , 減少了動態內存分配的開銷 ;
II. Buffer 屬性
Buffer 緩沖區基本屬性 :
- ① 容量 Capacity : 緩沖區元素個數 , 不可更改 ;
- ② 限制 Limit : 緩沖區的終點 , 從該索引開始 ( 包含該索引 ) , 不能對之后的元素進行讀寫操作 ; Limit 值可以修改 , 其值必須是自然數 ;
- ③ 位置 Position : 下一個要被讀取或寫入的元素索引 , 注意是下一個 , Position 初始值從 0 開始計數 , 如果沒有讀取就一直是 0 , 如果已經讀取了 1 個元素 , 其 Position 值在讀取完畢后變為 1 , 指向下一個將要讀取的元素 ;
- ④ 標記 Mark : 調用 mark() 方法可以設置標記 Mark = Position , 之后在任何時刻 , 調用 reset() 方法 , 可以讓 Position = Mark ;
四個屬性遵循的規律 : Mark≤Position≤Limit≤CapacityMark \leq Position \leq Limit \leq CapacityMark≤Position≤Limit≤Capacity
III. Buffer 數據讀寫
1. Buffer 的 7 個子類 ( ByteBuffer , CharBuffer , DoubleBuffer , FloatBuffer , IntBuffer , LongBuffer , ShortBuffer ) , 都定義了兩類方法 , 分別是 ① 讀取數據 , ② 寫入數據 ;
2. 相對操作和絕對操作 :
- ① 相對操作讀寫數據 : 緩沖區相對操作讀取或寫入數據 , 操作完畢后 , Position 被賦值為下一個將要讀取或寫入的元素索引 , 如果操作的 Position 超出了 Limit , 就會拋出異常 ;
- ② 絕對操作讀寫數據 : 直接使用元素索引進行操作 , 該操作不影響 Position 位置屬性 ; 如果索引超出了緩沖區大小 , 就會拋出異常 ;
IV. Buffer 標記 mark() 和重置 reset()
標記和重置方法 :
- ① 操作對象 : 標記 mark() 方法 操作的是 Mark 標記屬性 , 重置 reset() 方法 , 主要用于操作 Position 位置屬性 ;
- ② 設置標記 : mark() 方法用于設置標記 , 將當前的 Position 賦值給 Mark 屬性 ;
- ③ 位置重置 : reset() 方法用于重置 Position 位置屬性 , 將當前的 Position 位置屬性設置成 Mark 標記屬性值 ;
V. Buffer 清除 翻轉 重繞
1. 清除操作 : 調用 clear() 方法執行 , 執行了該方法后 , 將 Limit 限制屬性設置為緩沖區的容量大小 , 將 Position 位置屬性設置成 0 , 之后便可以重新從 0 位置開始讀寫緩沖區 ;
2. 翻轉操作 : 調用 flip() 方法執行 , 執行了該方法后 , 將 Limit 限制屬性設置為當前 Position 位置屬性, 將 Position 位置屬性設置成 0 , 之后便可以重新從 0 位置開始讀寫緩沖區 , 但是不能超過 Limit 位置 ;
3. 重繞操作 : 調用 rewind() 方法執行 , Limit 限制屬性保持不變 , 將 Position 位置屬性設置成 0 , 只是重新開始寫入或讀取 ;
VI. Buffer 緩沖區只讀屬性
Buffer 只讀緩沖區 :
- ① 只讀屬性 : Buffer 包裹的緩沖區可能是只讀的 , 不能向緩沖區中寫入數據 ;
- ② 只讀緩沖區操作 : 只讀緩沖區的內容是不可以修改的 , 但是緩沖區的 Mark 標記 , Limit 限制 , Position 位置屬性是可以改變的 , 緩沖區是只讀的 , 不可改變緩沖區及其內容 , 因此 Capacity 容量不可改變 ;
- ③ 判定是否是只讀緩沖區 : 可以調用 isReadOnly() 方法 , 判定該 Buffer 緩沖區是否是制度緩沖區 ;
VII. Buffer 的鏈式調用
1. 鏈式調用前提 : Buffer 緩沖區有很多方法的返回值是 Buffer 對象本身 , 如 :
- ① Buffer clear() 清除緩沖區 ,
- ② Buffer flip() 翻轉緩沖區 ,
- ③ Buffer limit(int newLimit) 設置緩沖區限制 ,
- ④ Buffer mark() 設置緩沖區標記 ,
- ⑤ Buffer position(int newPosition) 設置緩沖區位置 ,
- ⑥ Buffer reset() 重置緩沖區位置 ,
- ⑦ Buffer rewind() 緩沖區重繞 ;
2.鏈式調用示例 :
- ① 非鏈式調用 :
- ② 鏈式調用 :
總結
以上是生活随笔為你收集整理的【Java 网络编程】NIO Buffer 简介 ( 概念 | 数据传输 | 标记 | 位置 | 限制 | 容量 | 标记 | 重置 | 清除 | 翻转 | 重绕 | 链式操作 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java 并发编程】CountDown
- 下一篇: 【运筹学】线性规划数学模型 ( 三要素