亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文解讀java.nio.ByteBuffer

 更新時間:2023年08月21日 10:18:50   作者:bjxiaxueliang  
這篇文章主要介紹了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)文章

  • Java國際化簡介_動力節(jié)點Java學院整理

    Java國際化簡介_動力節(jié)點Java學院整理

    這篇文章主要為大家簡單介紹了Java國際化的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java生成圖形驗證碼工具類

    Java生成圖形驗證碼工具類

    這篇文章主要介紹了Java生成圖形驗證碼工具類,本文思路明確介紹的非常詳細,需要的朋友可以參考下
    2017-02-02
  • 深入淺析java中flyway使用簡介

    深入淺析java中flyway使用簡介

    Flyway是獨立于數(shù)據(jù)庫的應用、管理并跟蹤數(shù)據(jù)庫變更的數(shù)據(jù)庫版本管理工具。這篇文章主要介紹了flyway使用簡介,需要的朋友可以參考下
    2020-07-07
  • springboot項目整合mybatis并配置mybatis中間件的實現(xiàn)

    springboot項目整合mybatis并配置mybatis中間件的實現(xiàn)

    這篇文章主要介紹了springboot項目整合mybatis并配置mybatis中間件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Java批量寫入文件和下載圖片的示例代碼

    Java批量寫入文件和下載圖片的示例代碼

    這篇文章主要介紹了Java批量寫入文件和下載圖片的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • 解決Springboot獲取不到nacos配置中心的配置問題

    解決Springboot獲取不到nacos配置中心的配置問題

    由于項目使用的nacos老版本,存在風險bug, 需要將nacos升級至2.2.1及以上版本,版本升級完畢之后 啟動項目發(fā)現(xiàn)項目開始報錯,所以本文記錄一下Springboot獲取不到nacos配置中心的配置問題,文中有詳細的解決方法,需要的朋友可以參考下
    2023-09-09
  • SpringBoot整合SpringSecurity和JWT的示例

    SpringBoot整合SpringSecurity和JWT的示例

    這篇文章主要介紹了SpringBoot整合SpringSecurity和JWT的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • spring boot動態(tài)加載Echart餅狀圖

    spring boot動態(tài)加載Echart餅狀圖

    這篇文章主要為大家詳細介紹了spring boot動態(tài)加載Echart餅狀圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Spring容器的創(chuàng)建過程之如何注冊BeanPostProcessor詳解

    Spring容器的創(chuàng)建過程之如何注冊BeanPostProcessor詳解

    關(guān)于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結(jié)了如何注冊BeanPostProcessor,文中有非常詳細的圖文示例,需要的朋友可以參考下
    2021-06-06
  • Java static方法用法實戰(zhàn)案例總結(jié)

    Java static方法用法實戰(zhàn)案例總結(jié)

    這篇文章主要介紹了Java static方法用法,結(jié)合具體案例形式總結(jié)分析了java static方法功能、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-09-09

最新評論