一文解讀java.nio.ByteBuffer
java.nio.ByteBuffer
是一個可以進行 緩沖區(qū)分配 、 讀取 和 寫入 的緩沖區(qū),其 持有一個字節(jié)數(shù)組
并通過4個屬性:
capacity
limit
position
mark
來管理緩沖區(qū),進行字節(jié)級別讀取和數(shù)據(jù)寫入。
基于此,ByteBuffer常被用來處理網(wǎng)絡(luò)協(xié)議和I/O操作。
一、使用舉例
以下為ByteBuffer的使用舉例:
- 可以使用
put()
方法將數(shù)據(jù)寫入緩沖區(qū); - 可以使用
flip()
方法切換緩沖區(qū)為讀取模式; - 可以使用
rewind()
方法倒回緩沖區(qū)的初始位置; - 可以使用
get()
方法讀取緩沖區(qū)中的數(shù)據(jù); - 可以使用
clear()
方法清空緩沖區(qū),以便再次寫入數(shù)據(jù)。
import java.nio.ByteBuffer; public class JavaTest { public static void main(String[] args) { System.out.println("~~~~~~~~ put(byte b) ~~~~~~~~"); // 分配一個5字節(jié)的buffer ByteBuffer byteBuffer = ByteBuffer.allocate(5); // 向buffer中添加兩個字節(jié)的數(shù)據(jù),空余3個字節(jié)數(shù)據(jù) byteBuffer.put((byte)10); byteBuffer.put((byte)20); // 輸出整個字節(jié)數(shù)組 printByteBuffer(byteBuffer); System.out.println("~~~~~~~~ flip() ~~~~~~~~"); // 轉(zhuǎn)為讀模式 byteBuffer.flip(); // 輸出整個字節(jié)數(shù)組 printByteBuffer(byteBuffer); System.out.println("~~~~~~~~ get() ~~~~~~~~"); // 讀取當前 position System.out.println(byteBuffer.get()); // 輸出整個字節(jié)數(shù)組 printByteBuffer(byteBuffer); System.out.println("~~~~~~~~ rewind() ~~~~~~~~"); // 倒回緩沖區(qū)的初始位置 byteBuffer.rewind(); printByteBuffer(byteBuffer); System.out.println("~~~~~~~~ get(byte[] dst, int offset, int length) ~~~~~~~~"); // 將buffer中數(shù)據(jù)寫入到dstBytes中 byte[] dstBytes = new byte[2]; byteBuffer.get(dstBytes, 0, dstBytes.length); printByteBuffer(byteBuffer); } public static void printByteBuffer(ByteBuffer byteBuffer) { byte[] bytes = byteBuffer.array(); int position = byteBuffer.position(); int limit = byteBuffer.limit(); int remining = byteBuffer.remaining(); System.out.println("byteBuffer: " + Arrays.toString(bytes) + "\nPosition: " + position + " Limit: " + limit + " Remining: " + remining); } }
控制臺輸出如下:
~~~~~~~~ put(byte b) ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 2 Limit: 5 Remining: 3
~~~~~~~~ flip() ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 0 Limit: 2 Remining: 2
~~~~~~~~ get() ~~~~~~~~
10
byteBuffer: [10, 20, 0, 0, 0]
Position: 1 Limit: 2 Remining: 1
~~~~~~~~ rewind() ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 0 Limit: 2 Remining: 2
~~~~~~~~ get(byte[] dst, int offset, int length) ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 2 Limit: 2 Remining: 0
二、原理簡析
前邊說過 ByteBuffer持有一個字節(jié)數(shù)組
并通過4個屬性:
capacity
limit
position
mark
來管理緩沖區(qū)
這4個屬性遵循
mark <= position <= limit <= capacity ???????
下表格是對著4個屬性的解釋:
屬性 | 描述 |
---|---|
Capacity | 容量,即可以容納的最大數(shù)據(jù)量 |
Limit | 緩沖區(qū)的當前終點,不能對緩沖區(qū)超過極限的位置進行讀寫操作 |
Position | 下一個要被讀或?qū)懙脑氐乃饕?/td> |
Mark | 標記??烧{(diào)用mark()設(shè)置標記(mark=position),然后調(diào)用reset()讓position恢復到標記的位置 |
初始化,各控制屬性狀態(tài):
例如調(diào)用
ByteBuffer byteBuffer = ByteBuffer.allocate(5);
進行ByteBuffer存儲空間分配,
各屬性見下圖所示:
寫入數(shù)據(jù)后,各控制控制屬性狀態(tài):
例如調(diào)用
byteBuffer.put((byte)'a')
寫入數(shù)據(jù)后,
各屬性見下圖所示:
讀取數(shù)據(jù)后,各控制控制屬性狀態(tài):
例如調(diào)用
byteBuffer.get()
讀取4個字節(jié)后,
各屬性見下圖所示:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot項目整合mybatis并配置mybatis中間件的實現(xiàn)
這篇文章主要介紹了springboot項目整合mybatis并配置mybatis中間件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04解決Springboot獲取不到nacos配置中心的配置問題
由于項目使用的nacos老版本,存在風險bug, 需要將nacos升級至2.2.1及以上版本,版本升級完畢之后 啟動項目發(fā)現(xiàn)項目開始報錯,所以本文記錄一下Springboot獲取不到nacos配置中心的配置問題,文中有詳細的解決方法,需要的朋友可以參考下2023-09-09SpringBoot整合SpringSecurity和JWT的示例
這篇文章主要介紹了SpringBoot整合SpringSecurity和JWT的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06Spring容器的創(chuàng)建過程之如何注冊BeanPostProcessor詳解
關(guān)于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結(jié)了如何注冊BeanPostProcessor,文中有非常詳細的圖文示例,需要的朋友可以參考下2021-06-06Java static方法用法實戰(zhàn)案例總結(jié)
這篇文章主要介紹了Java static方法用法,結(jié)合具體案例形式總結(jié)分析了java static方法功能、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-09-09