亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Netty的NIO Buffer案例分析

發布時間:2021-11-16 09:42:07 來源:億速云 閱讀:142 作者:iii 欄目:大數據

這篇文章主要介紹“Netty的NIO Buffer案例分析”,在日常操作中,相信很多人在Netty的NIO Buffer案例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Netty的NIO Buffer案例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、Buffer概念

1、緩沖區獲取

    Buffer緩沖區是就是一個數組,有著不同的數據類型:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、
FloatBuffer、DoubleBuffer,然后這些數據類型都可以通過 allocate() 獲取緩沖區。

static XxxBuffer allocate(int capacity) : 創建一個容量為 capacity 的 XxxBuffer 對象,如下:

//1. 分配一個指定大小的Byte類型的緩沖區
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

2、緩沖區存取數據的兩個核心方法

put() : 存入數據到緩沖區中

put(byte b)將給定單個字節寫入緩沖區的當前位置

put(byte[] src)

將 src 中的字節寫入緩沖區的當前位置

put(int index, byte b)

將指定字節寫入緩沖區的索引位置(不會移動 position)


get() : 獲取緩沖區中的數據

get()

讀取單個字節

get(byte[] dst)

批量讀取多個字節到 dst 中

get(int index)

讀取指定索引位置的字節(不會移動 position)

byteBuffer.put(“Mujiutian”);
byteBuffer.get();

3、緩沖區中的四個核心屬性

0 <= mark <= position <= limit <= capacity

capacity : 容量,表示緩沖區中最大存儲數據的容量。一旦聲明不能改變。

byteBuffer.capacity()

limit : 界限,表示緩沖區中可以操作數據的大小。(limit 后數據不能進行讀寫)

byteBuffer.limit()

position : 位置,表示緩沖區中正在操作數據的位置。

byteBuffer.position()

mark : 標記,表示記錄當前 position 的位置。可以通過 reset() 恢復到 mark 的位置

byteBuffer.mark()

Netty的NIO Buffer案例分析

4、Buffer常用的方法

Netty的NIO Buffer案例分析

5、直接緩沖區與非直接緩沖區

非直接緩沖區:通過 allocate() 方法分配緩沖區,將緩沖區建立在 JVM 的內存中

Netty的NIO Buffer案例分析

直接緩沖區:通過 allocateDirect() 方法分配直接緩沖區,將緩沖區建立在物理內存中。可以提高效率

Netty的NIO Buffer案例分析

2、代碼講解

1、使用緩沖區的各種方法

@Test
public void test1(){
   String str = "MuJiuTian";
   
   //1. 分配一個指定大小的Byte類型的緩沖區
   ByteBuffer buf = ByteBuffer.allocate(1024);
   
   System.out.println("-----------------allocate()----------------");
   //此時緩沖區為讀,下標位置
   System.out.println(buf.position());
   //此時緩沖區的界線,也就是臨界點,1024
   System.out.println(buf.limit());
   //緩沖區的容量
   System.out.println(buf.capacity());
   
   //2. 利用 put() 存入數據到緩沖區中
   buf.put(str.getBytes());
   
   System.out.println("-----------------put()----------------");
   //此時緩沖區為讀,下標位置已經讀到第五個了
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //3. 切換讀取數據模式,切換為寫的模式,也就是把剛剛讀取的內容重新從下標0開始讀
   buf.flip();
   
   System.out.println("-----------------flip()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //4. 利用 get() 讀取緩沖區中的數據
   byte[] dst = new byte[buf.limit()];
   buf.get(dst);
   System.out.println(new String(dst, 0, dst.length));
   
   System.out.println("-----------------get()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //5. rewind() : 可重復讀
   buf.rewind();
   
   System.out.println("-----------------rewind()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //6. clear() : 清空緩沖區. 但是緩沖區中的數據依然存在,但是處于“被遺忘”狀態
   buf.clear();
   
   System.out.println("-----------------clear()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   System.out.println((char)buf.get());
}

結果:

Netty的NIO Buffer案例分析

看剛剛的流程圖:

Netty的NIO Buffer案例分析

2、使用簡單方法掌握buffer的基本方法

@Test
public void test2(){

   String str = "Mujiutian";

   //創建Byte類型緩沖區
   ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
   //此時為讀模式,讀取str內容
   byteBuffer.put(str.getBytes());
   //切換為寫的模式,處理剛剛讀取的內容
   byteBuffer.flip();

   //此時limit為9,因為讀取了Mujiutian 9個字節
   byte[] dst = new byte[byteBuffer.limit()];
   //讀取下標0到2的字節
   byteBuffer.get(dst, 0, 2);
   System.out.println(new String(dst, 0, 2));
   System.out.println(byteBuffer.position());
   
   //mark() : 標記
   byteBuffer.mark();

   byteBuffer.get(dst, 2, 2);
   System.out.println(new String(dst, 2, 2));
   System.out.println(byteBuffer.position());
   
   //reset() : 使用該方法,位置恢復到 mark 的位置
   byteBuffer.reset();
   System.out.println(byteBuffer.position());
   
   //判斷緩沖區中是否還有剩余數據
   if(byteBuffer.hasRemaining()){
      //獲取緩沖區中可以操作的數量
      System.out.println(byteBuffer.remaining());
   }
}

結果為:

Netty的NIO Buffer案例分析

3、測試是否為緩沖區

@Test
public void test3(){
   //分配直接緩沖區
   ByteBuffer buf = ByteBuffer.allocateDirect(1024);
   System.out.println(buf.isDirect());
}

結果:true

到此,關于“Netty的NIO Buffer案例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长兴县| 遂平县| 游戏| 南漳县| 北宁市| 陇西县| 伊吾县| 镇远县| 永州市| 海淀区| 南澳县| 民和| 普格县| 喀喇沁旗| 昂仁县| 浑源县| 福贡县| 金昌市| 旌德县| 连城县| 慈利县| 玉林市| 万盛区| 钦州市| 博兴县| 铜山县| 靖宇县| 遵化市| 拉萨市| 靖安县| 无棣县| 隆化县| 云南省| 梅河口市| 油尖旺区| 攀枝花市| 邵武市| 香港| 北票市| 龙门县| 密云县|