netty io.netty.buffer簡介

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()方法來將readerIndexwriterIndex 設置爲 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類型

    • Byte array

      若是ByteBuf內部實現是一個byte[], 能夠經過調用array() 方法來訪問數組.  判斷是不是byte[]能夠調用 hasArray()方法.

      NIO Buffers

      經過調用nioBuffer()方法能夠獲得一個NIO buffer,判斷可否進行轉換能夠調用nioBufferCount()方法.

      Strings

      能夠調用提供的多個 toString(Charset) 方法將 ByteBuf 轉換爲 String.  須要注意的是,toString() 不是轉換方法,而是繼承Object的toString()方法

      I/O Streams

      參考 ByteBufInputStreamByteBufOutputStream.


io.netty.buffer.ByteBufAllocator

    該接口的實現類負責建立buffer,接口實現類必須是線程安全的。

io.netty.buffer.ByteBufHolder

    發送接收的數據包

io.netty.buffer.AbstractByteBuf

    實現bytebuf的一個骨架

io.netty.buffer.AbstractByteBufAllocator

    ByteBufAllocator的骨架

io.netty.buffer.AbstractDerivedByteBuf

    Bytebuf的一個抽象基類,其主要功能是實現了可以封裝另外一個Bytebuf

io.netty.buffer.AbstractReferenceCountedByteBuf

    ByteBuf的一個抽象基類,主要功能是實現了引用計數的功能,即ReferenceCounted藉口的功能(retain和release、touch方法)

io.netty.buffer.ByteBufInputStream

    繼承了InputStream類,該類能夠從ByteBuf中讀取數據,對該對象進行讀操做的時候內部buffer的readerIndex也會增長,須要注意的是讀取的字節數量在初始化該對象的時候已經肯定了(構造函數內部,初始化的時候已經和設置了長度),後面在對該buffer寫數據,對該對象來說,不會讀到。

    改流仍是DataInput藉口,字節的序列並不老是大端序列(big endian),這取決於內部buffer實現

io.netty.buffer.ByteBufOutputStream

     繼承了OutputStream類,該類能夠向ByteBuf中寫數據,對該對象進行寫操做的時候內部buffer的writerindex也會增長,改流仍是DataOutput藉口,字節的序列並不老是大端序列(big endian),這取決於內部buffer實現

io.netty.buffer.ByteBufUtil

    這是一個處理ByteBuf對象的一些方法的工具類.

io.netty.buffer.CompositeByteBuf

    這是一個虛擬bufer,其實是一個組合buffer,其內部封裝了多個buffer,其功能就是將多個buffer組合成一個buffer,推薦使用ByteBufAllocator.compositeBuffer() 或者Unpooled.wrappedBuffer(ByteBuf...)來建立CompositeByteBuf對象,不要直接調用構造函數來建立對象

io.netty.buffer.DefaultByteBufHolder

    ByteBufHolder的默認實現,期功能就是把數據存儲在bytebuf中   

io.netty.buffer.DuplicatedByteBuf

    一個派生buffer,簡單的把全部的數據訪問請求發送給內部的buffer。簡易經過ByteBuf.duplicate()方法來建立該對象。該對象與其內部bufer共享數據,只不過兩者的readerindex和writerindex是獨立的。

io.netty.buffer.EmptyByteBuf

    這是一個空的ByteBuf,容量是0

io.netty.buffer.PooledByteBufAllocator

    帶緩衝的ByteBufAllocator

io.netty.buffer.ReadOnlyByteBuf

    這個一個派生buffer,他禁止寫操做發送給內部buffer,簡易經過 Unpooled.unmodifiableBuffer(ByteBuf) 方法來建立對象


io.netty.buffer.SliceByteBuf

    一個派生buffer,他的功能是僅僅暴露內部buffer的一個自區域,就是切片,推薦經過ByteBuf.slice() andByteBuf.slice(int, int)方法來建立對象

io.netty.buffer.SwappedByteBuf

    一個包裝buffer,其功能是交換bytebuf的字節序列,即大端序列和小端序列的轉換


io.netty.buffer. Unpooled

    

io.netty.buffer.UnpooledByteBufAllocator

帶緩衝的ByteBufAllocator

io.netty.buffer.UnpooledDirectByteBuf

基於NIO ByteBuffer的ByteBuf,推薦經過調用Unpooled.directBuffer(int)或者Unpooled.wrappedBuffer(ByteBuffer)方法來建立對象

io.netty.buffer.UnpooledHeapByteBuf

大端序列的java堆buffer實現

io.netty.buffer.Unpooled

至關於一個工具類,能夠建立Bytebuf

相關文章
相關標籤/搜索