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