您好,登錄后才能下訂單哦!
這篇文章主要介紹“Netty的NIO Buffer案例分析”,在日常操作中,相信很多人在Netty的NIO Buffer案例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Netty的NIO Buffer案例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
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()
4、Buffer常用的方法
5、直接緩沖區(qū)與非直接緩沖區(qū)
非直接緩沖區(qū):通過 allocate() 方法分配緩沖區(qū),將緩沖區(qū)建立在 JVM 的內(nèi)存中
直接緩沖區(qū):通過 allocateDirect() 方法分配直接緩沖區(qū),將緩沖區(qū)建立在物理內(nèi)存中??梢蕴岣咝?/p>
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é)果:
看剛剛的流程圖:
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é)果為:
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í)用的文章!
免責(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)容。