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;
}