溫馨提示×

溫馨提示×

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

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

Netty的NIO Buffer案例分析

發(fā)布時(shí)間:2021-11-16 09:42:07 來源:億速云 閱讀:142 作者:iii 欄目:大數(shù)據(jù)

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

1、Buffer概念

1、緩沖區(qū)獲取

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

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

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

2、緩沖區(qū)存取數(shù)據(jù)的兩個(gè)核心方法

put() : 存入數(shù)據(jù)到緩沖區(qū)中

put(byte b)將給定單個(gè)字節(jié)寫入緩沖區(qū)的當(dāng)前位置

put(byte[] src)

將 src 中的字節(jié)寫入緩沖區(qū)的當(dāng)前位置

put(int index, byte b)

將指定字節(jié)寫入緩沖區(qū)的索引位置(不會(huì)移動(dòng) position)


get() : 獲取緩沖區(qū)中的數(shù)據(jù)

get()

讀取單個(gè)字節(jié)

get(byte[] dst)

批量讀取多個(gè)字節(jié)到 dst 中

get(int index)

讀取指定索引位置的字節(jié)(不會(huì)移動(dòng) position)

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

3、緩沖區(qū)中的四個(gè)核心屬性

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

capacity : 容量,表示緩沖區(qū)中最大存儲(chǔ)數(shù)據(jù)的容量。一旦聲明不能改變。

byteBuffer.capacity()

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

byteBuffer.limit()

position : 位置,表示緩沖區(qū)中正在操作數(shù)據(jù)的位置。

byteBuffer.position()

mark : 標(biāo)記,表示記錄當(dāng)前 position 的位置??梢酝ㄟ^ reset() 恢復(fù)到 mark 的位置

byteBuffer.mark()

Netty的NIO Buffer案例分析

4、Buffer常用的方法

Netty的NIO Buffer案例分析

5、直接緩沖區(qū)與非直接緩沖區(qū)

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

Netty的NIO Buffer案例分析

直接緩沖區(qū):通過 allocateDirect() 方法分配直接緩沖區(qū),將緩沖區(qū)建立在物理內(nèi)存中??梢蕴岣咝?/p>

Netty的NIO Buffer案例分析

2、代碼講解

1、使用緩沖區(qū)的各種方法

@Test
public void test1(){
   String str = "MuJiuTian";
   
   //1. 分配一個(gè)指定大小的Byte類型的緩沖區(qū)
   ByteBuffer buf = ByteBuffer.allocate(1024);
   
   System.out.println("-----------------allocate()----------------");
   //此時(shí)緩沖區(qū)為讀,下標(biāo)位置
   System.out.println(buf.position());
   //此時(shí)緩沖區(qū)的界線,也就是臨界點(diǎn),1024
   System.out.println(buf.limit());
   //緩沖區(qū)的容量
   System.out.println(buf.capacity());
   
   //2. 利用 put() 存入數(shù)據(jù)到緩沖區(qū)中
   buf.put(str.getBytes());
   
   System.out.println("-----------------put()----------------");
   //此時(shí)緩沖區(qū)為讀,下標(biāo)位置已經(jīng)讀到第五個(gè)了
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //3. 切換讀取數(shù)據(jù)模式,切換為寫的模式,也就是把剛剛讀取的內(nèi)容重新從下標(biāo)0開始讀
   buf.flip();
   
   System.out.println("-----------------flip()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //4. 利用 get() 讀取緩沖區(qū)中的數(shù)據(jù)
   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() : 可重復(fù)讀
   buf.rewind();
   
   System.out.println("-----------------rewind()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //6. clear() : 清空緩沖區(qū). 但是緩沖區(qū)中的數(shù)據(jù)依然存在,但是處于“被遺忘”狀態(tài)
   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());
}

結(jié)果:

Netty的NIO Buffer案例分析

看剛剛的流程圖:

Netty的NIO Buffer案例分析

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

@Test
public void test2(){

   String str = "Mujiutian";

   //創(chuàng)建Byte類型緩沖區(qū)
   ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
   //此時(shí)為讀模式,讀取str內(nèi)容
   byteBuffer.put(str.getBytes());
   //切換為寫的模式,處理剛剛讀取的內(nèi)容
   byteBuffer.flip();

   //此時(shí)limit為9,因?yàn)樽x取了Mujiutian 9個(gè)字節(jié)
   byte[] dst = new byte[byteBuffer.limit()];
   //讀取下標(biāo)0到2的字節(jié)
   byteBuffer.get(dst, 0, 2);
   System.out.println(new String(dst, 0, 2));
   System.out.println(byteBuffer.position());
   
   //mark() : 標(biāo)記
   byteBuffer.mark();

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

結(jié)果為:

Netty的NIO Buffer案例分析

3、測試是否為緩沖區(qū)

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

結(jié)果:true

到此,關(guān)于“Netty的NIO Buffer案例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI