您好,登錄后才能下訂單哦!
這篇文章主要介紹“Netty的NIO Buffer案例分析”,在日常操作中,相信很多人在Netty的NIO Buffer案例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Netty的NIO 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()
4、Buffer常用的方法
5、直接緩沖區與非直接緩沖區
非直接緩沖區:通過 allocate() 方法分配緩沖區,將緩沖區建立在 JVM 的內存中
直接緩沖區:通過 allocateDirect() 方法分配直接緩沖區,將緩沖區建立在物理內存中。可以提高效率
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()); }
結果:
看剛剛的流程圖:
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()); } }
結果為:
3、測試是否為緩沖區
@Test public void test3(){ //分配直接緩沖區 ByteBuffer buf = ByteBuffer.allocateDirect(1024); System.out.println(buf.isDirect()); }
結果:true
到此,關于“Netty的NIO Buffer案例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。