Java - ByteBuffer字節數組緩衝器。讀取數據和寫入數據執行flip和clear的原理

ByteBuffer繼承於Buffer。

使用一個字節數組作爲緩衝器。讀取的數據和發送的數據會放入字節數組hb中。當數組達到一定大小,一次性寫入通道或者讀取。避免每次操作都要進行讀寫操作。

public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer>
{
    final byte[] hb;                    /** 非空數組,用於堆緩衝區*/
    final int offset;                   /** 偏移量 */
    boolean isReadOnly;                 /** 是否只讀*/
    ...
}

爲了方便管理該字節數組,使用了偏移量offset  以及Buffer類中的 

private int mark = -1;           // 標誌,可用於恢復重做
private int position = 0;        // 當前位置
private int limit;               // 本次操作最大的字節大小
private int capacity;            // 容量大小
long address;                    // 地址:僅由直接緩衝區使用。

具體原理是,將數據放入字節數組中,並用limit告知本數組中的有效數據大小。position爲當前操作的下標。

mark是標誌上一次執行完整讀取或者存放一系列數據成功之後的下標(需要手動設置),如果本次操作發生錯誤,則只需要從mark下標處重新操作。不需要從下標0開始。

 

準備從buffer中讀取數據時,需要先執行flip()操作。設置關於讀取數據的參數。將limit設爲有效字符的大小,即上次操作之後的下標position。修改position爲0,意爲下次從0開始讀取數據。mark設爲初始值-1;

    /** 用於讀取前操作,設置讀取的長度limit,下標歸0*/
    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

如果不執行flip操作,會導致從末尾進行讀取操作,那得到的數據爲0,或者爲內存中殘留數據。

 

與之相對應的,寫數據進buff時。需要執行clear()操作。旨在修正各項下標參數爲初始值,從0開始寫入。

如果不執行clear()操作,直接執行read,那等同於追加操作。

    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章