io.netty.util.ReferenceCounted
html
此接口表明一個引用計數的對象,此對象須要顯示的釋放.java
當一個ReferenceCounted
對象被實例化的時候,該對象的引用數量就是1,調用retain()
方法會增長引用數量,調用 release()
方法會減小引用數量,若是引用數量減小到0,該對象就須要顯示釋放掉。訪問釋放掉的對象一般會致使訪問衝突。web
若是實現ReferenceCounted
接口的對象是一個包含一樣實現ReferenceCounted
接口的對象的容器。當容器的引用數量變爲0的時候,容器中的對象也要經過release()
方法來釋放掉。api
主要方法:數組
int refCnt(); //返回當前對象的引用數量,若是返回零,說明當前對象已經被釋放掉了
ReferenceCounted retain();//引用數量增長1
ReferenceCounted retain(int increment);//引用計數增長給定值increment
ReferenceCounted touch();\\此方法記錄對象的當前訪問位置,主要用來調試。若是肯定當前對象內存泄露,經過此操做記 \\錄的信息將經過ResourceLeakDetector提供給你
ReferenceCounted touch(Object hint);\\此方法記錄對象的當前訪問位置並附加一個hint對象,主要用來調試。若是 \\肯定當前對象內存泄露,經過此操做記錄的信息將經過ResourceLeakDetector提供給你
boolean release();\\引用計數減1,若是引用計數變爲0了,則顯示的釋放掉該對象,當且僅當引用計數變爲0且該對象已 \\被釋放掉才返回ture,不然返回false
boolean release(int decrement);\\引用計數減小給定值decrement,若是引用計數變爲0了,則顯示的釋放掉該對象, 當且僅當引用計數變爲0且該對象已被釋放掉才返回ture,不然返回false
io.netty.buffer.ByteBuf安全
這是一個隨機和順序訪問的序列其包含0或者多個字節,此接口爲一個或者多字節數組和NIO buffers提供了一個抽象試圖app
建立buffer dom
建議使用輔助方法建立一個新的緩衝區不要調用具體實現的構造函數。
函數
隨進訪問索引 工具
就像普通的byte數組同樣,ByteBuf使用基於0的索引,也就是第一個的索引是0最後一個元素的索引是capacity-1,下面舉例迭代訪問buffer中的全部字節,作以下操做的時候你能夠忽略其內部實現:
ByteBuf buffer = ...; for (int i = 0; i < buffer.capacity(); i ++) { byte b = buffer.getByte(i); System.out.println((char) b); }
順序訪問索引
ByteBuf
提供了兩個指針變量來分別支持讀和寫操做, readerIndex
用於讀操做,
writerIndex
用於寫操做. 下面的圖展現了一個buffer使如何被兩個指針分割成三個區域的:
+-------------------+------------------+------------------+ | discardable bytes | readable bytes | writable bytes | | | (CONTENT) | | +-------------------+------------------+------------------+ | | | | 0 <= readerIndex <= writerIndex <= capacity
discardable bytes表明可廢棄的區域,readable bytes代碼可讀區域,writable bytes表明可寫區域 readerIndex表明讀的起點,writerIndex表明寫的起點,capacity表明容量
可讀區域(實際內容)
這個區域存儲的是實際的數據或者叫有效的數據. 任何以read或者skip開頭的操做(任何是指本類中的任何方法)都會獲得或者跳過當前readerIndex指示的數據,而且readerIndex會根據讀取或者跳過的字節數自增。若是讀取 操做的參數也是一個Byte而且沒有指定目標ByteBuf的起始index,則該參數ByteBuf的writerIndex也要跟着一塊兒增加。
若是沒有足夠的數據供讀取則報IndexOutOfBoundsException。新分配、wrapped或者拷貝的buffer,其readerIndex是0.相關讀取操做以下:
// Iterates the readable bytes of a buffer. ByteBuf buffer = ...; while (buffer.readable()) { System.out.println(buffer.readByte()); }
可寫數據區域
此區域是未定義的區域也就是須要往裏面寫數據的區域。任何以write開始的操做(任何是指本類中的任何方法)將會從writerIndex開始寫數據,而且writerIndex會根據寫入的數量增長。若是write操做的參數也是一個ByteBuf而且沒有制定源Buff的開始index, 那麼該參數ByteBuf的readerInx也要跟着一塊兒增加.
若是沒有足夠的空間供寫入報IndexOutOfBoundsException
,新分配的buffer的writerIndex是0. wrapped 或者copy的 bufferwriterIndex 等於capacity。寫入操做代碼:
// Fills the writable bytes of a buffer with random integers. ByteBuf buffer = ...; while (buffer.maxWritableBytes() >= 4) { buffer.writeInt(random.nextInt()); }
可廢棄區域
這個區域包含的是經過讀操做讀完的數據區域.初始狀態這個區域的大小是0
, 隨着讀操做的調用這個區域會增加到writerIndex的大小. 讀過的數據能夠經過調用discardReadBytes()方法回收該區域,該方法的功能以下
:
BEFORE discardReadBytes()//操做前 +-------------------+------------------+------------------+ | discardable bytes | readable bytes | writable bytes | +-------------------+------------------+------------------+ | | | | 0 <= readerIndex <= writerIndex <= capacity AFTER discardReadBytes()//操做後 +------------------+--------------------------------------+ | readable bytes | writable bytes (got more space) | +------------------+--------------------------------------+ | | | readerIndex (0) <= writerIndex (decreased) <= capacity
須要注意的是,不能保證可寫區域的數據內容,可寫區域的內容多數狀況下不會跟着移動,甚至有可能被不一樣的數據填充,這依賴於具體的buffer實現。
清空緩衝索引
你能夠經過調用clear()方法來將
readerIndex
和 writerIndex
設置爲 0
. 可是不會清除內容,而只是重置了兩個指針. 注意這裏的clear()方法語義和java.nio.Buffer.clear()語義是不同的。
BEFORE clear() +-------------------+------------------+------------------+ | discardable bytes | readable bytes | writable bytes | +-------------------+------------------+------------------+ | | | | 0 <= readerIndex <= writerIndex <= capacity AFTER clear() +---------------------------------------------------------+ | writable bytes (got more space) | +---------------------------------------------------------+ | | 0 = readerIndex = writerIndex <= capacity
search相關操做
對於簡單的字節搜索,使用 indexOf(int, int, byte)
和 bytesBefore(int, int, byte)
. bytesBefore(byte)
. 對於複雜的搜索使用 forEachByte(int, int, ByteBufProcessor)
方法,該方法須要一個 ByteBufProcessor
的實現類.
標記和充值 (mark reset)
每一個buffer有兩個marker indexes. 一個用來存儲 readerIndex
另外一個用來存儲 writerIndex
. 能夠經過調用reset方法重置,其工做方式相似於InputStream中的mark和reset方法,不一樣的是其沒有readlimit參數.
派生緩衝區(Derived buffers)
你能夠經過調用方法duplicate()
, slice()
or slice(int, int)
來根據現有buffer建立一個試圖(view) . 一個派生的buffer會有一個獨立的readerIndex
, writerIndex
和 marker indexes,同時會共享內部數據,這和Java NIO同樣.若是要完整拷貝一個buffer,須要調用copy()
方法.
轉換成現有的JAVA類型
若是ByteBuf內部實現是一個byte[], 能夠經過調用array()
方法來訪問數組. 判斷是不是byte[]能夠調用 hasArray()
方法.
經過調用nioBuffer()
方法能夠獲得一個NIO buffer,判斷可否進行轉換能夠調用nioBufferCount()
方法.
能夠調用提供的多個 toString(Charset)
方法將 ByteBuf
轉換爲 String
. 須要注意的是,toString()
不是轉換方法,而是繼承Object的toString()方法
參考 ByteBufInputStream
和 ByteBufOutputStream
.
io.netty.buffer.ByteBufAllocator
該接口的實現類負責建立buffer,接口實現類必須是線程安全的。
發送接收的數據包
實現bytebuf的一個骨架
ByteBufAllocator
的骨架
Bytebuf的一個抽象基類,其主要功能是實現了可以封裝另外一個Bytebuf
ByteBuf的一個抽象基類,主要功能是實現了引用計數的功能,即ReferenceCounted藉口的功能(retain和release、touch方法)
繼承了InputStream類,該類能夠從ByteBuf中讀取數據,對該對象進行讀操做的時候內部buffer的readerIndex也會增長,須要注意的是讀取的字節數量在初始化該對象的時候已經肯定了(構造函數內部,初始化的時候已經和設置了長度),後面在對該buffer寫數據,對該對象來說,不會讀到。
改流仍是DataInput
藉口,字節的序列並不老是大端序列(big endian),這取決於內部buffer實現
繼承了OutputStream類,該類能夠向ByteBuf中寫數據,對該對象進行寫操做的時候內部buffer的writerindex也會增長,改流仍是DataOutput
藉口,字節的序列並不老是大端序列(big endian),這取決於內部buffer實現
這是一個處理ByteBuf對象的一些方法的工具類.
這是一個虛擬bufer,其實是一個組合buffer,其內部封裝了多個buffer,其功能就是將多個buffer組合成一個buffer,推薦使用ByteBufAllocator.compositeBuffer()
或者Unpooled.wrappedBuffer(ByteBuf...)來建立CompositeByteBuf對象,不要直接調用構造函數來建立對象
ByteBufHolder
的默認實現,期功能就是把數據存儲在bytebuf中
一個派生buffer,簡單的把全部的數據訪問請求發送給內部的buffer。簡易經過ByteBuf.duplicate()
方法來建立該對象。該對象與其內部bufer共享數據,只不過兩者的readerindex和writerindex是獨立的。
這是一個空的ByteBuf,容量是0
帶緩衝的ByteBufAllocator
這個一個派生buffer,他禁止寫操做發送給內部buffer,簡易經過 Unpooled.unmodifiableBuffer(ByteBuf)
方法來建立對象
io.netty.buffer.SliceByteBuf
一個派生buffer,他的功能是僅僅暴露內部buffer的一個自區域,就是切片,推薦經過ByteBuf.slice()
andByteBuf.slice(int, int)
方法來建立對象
一個包裝buffer,其功能是交換bytebuf的字節序列,即大端序列和小端序列的轉換
io.netty.buffer. Unpooled
帶緩衝的ByteBufAllocator
基於NIO ByteBuffer
的ByteBuf,推薦經過調用Unpooled.directBuffer(int)或者
Unpooled.wrappedBuffer(ByteBuffer)方法來建立對象
大端序列的java堆buffer實現
至關於一個工具類,能夠建立Bytebuf