日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Netty】NIO 缓冲区 ( Buffer ) 组件

發(fā)布時(shí)間:2025/6/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Netty】NIO 缓冲区 ( Buffer ) 组件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • I . NIO 三大核心組件 對(duì)應(yīng)關(guān)系
        • II . 緩沖區(qū) ( Buffer ) 類
        • III . 緩沖區(qū) ( Buffer ) 機(jī)制
        • IV . 緩沖區(qū) ( Buffer ) 機(jī)制 示例解析
        • V . 緩沖區(qū) ( Buffer ) 提供的方法
        • VI . 字節(jié)緩沖區(qū) ( ByteBuffer ) 提供的方法





I . NIO 三大核心組件 對(duì)應(yīng)關(guān)系



下圖是 NIO 三大核心組件 , 選擇器 ( Selector ) , 通道 ( Channel ) , 緩沖區(qū) ( Buffer ) , 與 服務(wù)器端線程 , 客戶端 , 結(jié)構(gòu)圖 ;

1 . 解析上圖 NIO 核心組件對(duì)應(yīng)關(guān)系 :


① 通道 緩沖區(qū) 對(duì)應(yīng) : 每個(gè) 通道 ( Channel ) 都對(duì)應(yīng)一個(gè) 緩沖區(qū) ( Buffer ) ;

② 選擇器 通道 關(guān)聯(lián)方式 : 每個(gè) 選擇器 ( Selector ) 對(duì)應(yīng)多個(gè) 通道 ( Channel ) , 通道 ( Channel ) 是通過注冊(cè)的方式 , 注冊(cè)給 選擇器 ( Selector ) ;

③ 選擇器 線程 對(duì)應(yīng) : 每個(gè) 選擇器 ( Selector ) 對(duì)應(yīng)一個(gè)線程 ;

④ 線程 通道 對(duì)應(yīng) : 每個(gè)線程 對(duì)應(yīng)多個(gè) 通道 ( Channel ) ;



2 . 引申要素分析 :


① BIO 單向流機(jī)制 : BIO 中使用 Socket 進(jìn)行通信時(shí) , 每個(gè)流都是 單向 的 , 輸入流只能讀取數(shù)據(jù) , 不能寫出數(shù)據(jù) ; 輸出流只能寫出數(shù)據(jù) , 不能讀取數(shù)據(jù) ;

② 緩沖區(qū) ( Buffer ) 本質(zhì) : 緩沖區(qū) ( Buffer ) 本質(zhì)是一個(gè)數(shù)組 ;

③ 緩沖區(qū) ( Buffer ) 雙向機(jī)制 : NIO 中的 緩沖區(qū) ( Buffer ) 是 雙向 的 , 既可以讀取數(shù)據(jù) , 又可以寫出數(shù)據(jù) , 但是注意讀寫的方向是相反的 , 讀取狀態(tài) 轉(zhuǎn)為 寫出狀態(tài)時(shí) , 需要調(diào)用 flip() 方法翻轉(zhuǎn) 緩沖區(qū) ( Buffer ) ;

④ 通道 ( Channel ) 雙向機(jī)制 : 通道 ( Channel ) 負(fù)責(zé)讀寫 緩沖區(qū) ( Buffer ) , 因此 通道 ( Channel ) 也必須是雙向的 ;

⑤ 事件 ( Event ) : 事件 ( Event ) 決定 選擇器 ( Selector ) 選擇哪條 通道 ( Channel ) , 決定線程 為哪個(gè) 通道 ( Channel ) 服務(wù) ;





II . 緩沖區(qū) ( Buffer ) 類



Buffer 常用子類 :

  • ByteBuffer : 字節(jié) 緩沖區(qū) ;
  • ShortBuffer : 短整型 緩沖區(qū) ;
  • CharBuffer : 字符 緩沖區(qū) ;
  • IntBuffer : 整型 緩沖區(qū) ;
  • LongBuffer : 長(zhǎng)整型 緩沖區(qū) ;
  • DoubleBuffer : 雙精度浮點(diǎn)型 緩沖區(qū) ;
  • FloatBuffer : 單精度浮點(diǎn)型 緩沖區(qū) ;

上述 ByteBuffer 使用頻率最高 , 一般情況下 , 傳輸數(shù)據(jù)使用 ByteBuffer 進(jìn)行數(shù)據(jù)的傳輸 ;





III . 緩沖區(qū) ( Buffer ) 機(jī)制



緩沖區(qū) ( Buffer ) : 緩沖區(qū) ( Buffer ) 是 在內(nèi)存中開辟出一塊內(nèi)存 , 并提供一組 API 專門用于讀寫內(nèi)存中的數(shù)據(jù) ;


緩沖區(qū) ( Buffer ) 機(jī)制 : 其內(nèi)部提供了一系列機(jī)制 , 如記錄當(dāng)前的操作 ( 讀取 / 寫出 ) 位置 等實(shí)時(shí)信息 ;



緩沖區(qū) ( Buffer ) 標(biāo)志位 :


① mark : 標(biāo)記 , 用途由開發(fā)者自定義 ;

② position : 標(biāo)識(shí)當(dāng)前數(shù)組索引 ;

③ limit : 緩沖區(qū)當(dāng)前的限制大小 , 如果當(dāng)前的 position 大于 limit 值 , 無法進(jìn)行讀寫操作 , 該值可以修改 ;

④ capacity : 緩沖區(qū) ( Buffer ) 容量 , 緩沖區(qū)創(chuàng)建時(shí)設(shè)置 , 無法修改該容量值 ;


mark ≤\leq position ≤\leq limit ≤\leq capacity





IV . 緩沖區(qū) ( Buffer ) 機(jī)制 示例解析



解析 緩沖區(qū) ( Buffer ) 機(jī)制 , 逐步 Debug 代碼 , 及給出每個(gè)步驟的示意圖 , 解析過程中的 1 . 2 . 3 . 標(biāo)號(hào)與代碼中的標(biāo)號(hào)一致 ;


public class BufferDemo {public static void main(String[] args) {//1 . 創(chuàng)建一個(gè)存儲(chǔ) Int 類型數(shù)據(jù)的 Buffer , 可以存儲(chǔ) 8 個(gè) Int 數(shù)據(jù)IntBuffer buffer = IntBuffer.allocate(8);//2 . 設(shè)置 只 讀寫 3 個(gè)元素buffer.limit(3);//3 . 向 Buffer 中寫入數(shù)據(jù)for(int i = 0; i < buffer.limit(); i ++){buffer.put(i);}//從 Buffer 中取出數(shù)據(jù)//4 . 先將 Buffer 翻轉(zhuǎn)一下 , 然后讀取 , 讀出的數(shù)據(jù)與存儲(chǔ)的數(shù)據(jù)順序一樣buffer.flip();//5 . 循環(huán)讀取 buffer 中的 Int 數(shù)據(jù), 維護(hù)了一個(gè)索引 ,//代表當(dāng)前操作的數(shù)據(jù)索引 , 即 positionwhile (buffer.hasRemaining()){System.out.println("position " + buffer.position() + " . " + buffer.get());}} }

1 . 創(chuàng)建 Buffer 緩沖區(qū) : 此時(shí)創(chuàng)建了一個(gè)空的緩沖區(qū) , 888 個(gè)元素默認(rèn)初始化為 0 , position 為 000 , limit 和 capacity 為 888 ;



2 . 設(shè)置 limit 限制 : 只使用 888 個(gè)容器中的 333 個(gè) , 如果 position ≥\geq 3 , 讀寫時(shí)報(bào)異常 ;


3 . 向 Buffer 中寫入數(shù)據(jù) :


① 向 Buffer 中寫入 000 : 寫入后 , position 變?yōu)?111 , 第 0 個(gè)元素變?yōu)?0 ( 看不出來 ) ;



② 向 Buffer 中寫入 111 : 寫入后 , position 變?yōu)?222 , 第 1 個(gè)元素變?yōu)?1 ;


③ 向 Buffer 中寫入 222 : 寫入后 , position 變?yōu)?333 , 第 2 個(gè)元素變?yōu)?2 ; 此時(shí) position ≥\geq limit , 如果在讀寫緩沖區(qū) , 就要崩潰了 , 退出循環(huán) , 執(zhí)行下面的操作 ;


4 . 翻轉(zhuǎn)操作 : 將當(dāng)前的 position 333 設(shè)置成 limit , 然后將 position 設(shè)置成 000 , 清除 mark 值 ( 這里沒有 ) ;



5 . 讀取 緩沖區(qū) ( Buffer ) 數(shù)據(jù) :


① 讀取 第 000 個(gè)數(shù)據(jù) : 讀取到 000 , position 變?yōu)?111 ;




② 讀取 第 111 個(gè)數(shù)據(jù) : 讀取到 111 , position 變?yōu)?222 ;


③ 讀取 第 111 個(gè)數(shù)據(jù) : 讀取到 222 , position 變?yōu)?333 ; 至此 , 程序全部執(zhí)行完畢 ;






V . 緩沖區(qū) ( Buffer ) 提供的方法



Buffer 是抽象類 , 是所有的 緩沖區(qū)類的父類 , 其提供的以下方法 , 在其它 777 個(gè)類中都可以使用 ;


與標(biāo)志位相關(guān)方法 :

  • int capacity() : 獲取緩沖區(qū)容量 ;
  • int position() : 獲取緩沖區(qū)當(dāng)前讀取或?qū)懗龅乃饕恢?, 每讀取 / 寫出 一個(gè)元素 , 位置都會(huì)自增 , 指向下一個(gè)將要讀取 / 寫出的位置 ;
  • Buffer position (int newPosition) : 強(qiáng)行設(shè)置緩沖區(qū)的位置 , 跳轉(zhuǎn)到指定的位置讀取或?qū)懗鰯?shù)據(jù) ;
  • int limit() : 獲取緩沖區(qū)可操作性限制大小 ;
  • Buffer limit(int newLimit) : 設(shè)置緩沖區(qū)的新的可操作限制大小 ;
  • Buffer mark() : 將當(dāng)前的 position 設(shè)置為 mark ;
  • Buffer reset() : 將 position 設(shè)置成 mark 的位置 ;

緩沖區(qū)變換相關(guān)方法 :

  • Buffer clear() : 清除緩沖區(qū)的四大標(biāo)志位 , 緩沖區(qū)的數(shù)據(jù)保持不變 ;
  • Buffer flip() : 翻轉(zhuǎn)操作 , limit 設(shè)置成當(dāng)前 position 值 , position 設(shè)置為 0, mark 清除 ;
  • Buffer rewind() : 重繞操作 ;
  • Buffer remaining() : 獲取當(dāng)前 position 和 limit 的差值 ;

判定相關(guān)方法 :

  • boolean hasRemaining() : position 和 limit 是否相等 , 之間還有沒有元素 ;
  • boolean isReadOnly() : 當(dāng)前緩沖區(qū)是否是可讀緩沖區(qū) ;
  • boolean isDirect() : 該緩沖區(qū)是否是直接緩沖區(qū) ;

數(shù)組相關(guān) :

  • boolean hasArray() : 該緩沖區(qū)的底層實(shí)現(xiàn)數(shù)組是否可以訪問 ;
  • Object array() : 獲取緩沖區(qū)的底層數(shù)組 ;
  • int arrayOffset() : 獲取 緩沖區(qū)第一個(gè)元素在底層數(shù)組中的索引 ;




VI . 字節(jié)緩沖區(qū) ( ByteBuffer ) 提供的方法



字節(jié)緩沖區(qū) ( ByteBuffer ) 是最常用的緩沖區(qū) , 一般在客戶端與服務(wù)器端交互使用的最多的就是字節(jié)緩沖區(qū) ;

ByteBuffer 是 Buffer 的派生類 , 因此上面的 Buffer 中的所有方法都可以在 ByteBuffer 中使用 ;


緩沖區(qū)構(gòu)建相關(guān) API :

  • ByteBuffer allocateDirect(int capacity) : 創(chuàng)建直接字節(jié)緩沖區(qū) , 并指定緩沖區(qū)大小 ;
  • ByteBuffer allocate(int capacity) : 創(chuàng)建字節(jié)緩沖區(qū) , 并指定緩沖區(qū)大小 ;
  • ByteBuffer wrap(byte[] array) : 創(chuàng)建字節(jié)緩沖區(qū) , 將 byte 數(shù)組放入緩沖區(qū)中 ;
  • ByteBuffer wrap(byte[] array , int offset , int length) : 創(chuàng)建字節(jié)緩沖區(qū) , 將 byte 數(shù)組 的 第 offset 個(gè)元素開始的 length 個(gè)元素 放入緩沖區(qū)中 ;

總結(jié)

以上是生活随笔為你收集整理的【Netty】NIO 缓冲区 ( Buffer ) 组件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。