ByteBuf通過兩個指針協助讀寫操作,讀操作使用readerIndex,寫操作使用writerIndex.
readerIndex、writerIndex初始值是0,寫入數據時writerIndex增加,讀取數據時readerIndex增加,但是readerIndex不會超過writerIndex.
讀取之後,0-readerIndex之間的空間視為discard的,調用discardReadByte方法可以釋放這壹部分空間,作用類似於ByteBuffer的compact方法.readerIndex-writerIndex之間的數據是可讀的,等價於ByteBuffer中position-limit之間的數據.
writerIndex-capacity之間的空間是可寫的,等價於ByteBuffer中limit-capacity之間的空間.
讀只影響readerIndex、寫只影響writerIndex,讀寫之間不需要調整指針位置,所以相較於NIO的ByteBuffer,可以極大的簡化讀寫操作
調用discardReadBytes會發生字節數組的內存復制,所以頻繁調用會導致性能下降
ByteBuf對write操作進行了封裝,有ByteBuf的write操作負責進行剩余咳喲好難過空間的校驗,如果可用緩沖區不足,ByteBuf會自動進行動態擴展。對於使用者而言不需要關心底層的校驗和擴展細節,只需要不超過capacity即可
對緩沖區進行讀操作時,有的時候我們需要對之前的操作進行回滾,讀操作並不會改變緩沖區的內容,回滾主要是重新設置索引信息
Mark:將當前的位置指針被分到mark變量中
Reset:恢復位置指針為mark中的變量值
ByteBuf有readerIndex、writerIndex,所以有四個相應的方法
markReaderIndex: 將當前readerIndex備份到markedReaderIndex中
resetReaderIndex: 將當前readerIndex設置為markedReaderIndex
markWriterIndex: 將當前readerIndex備份到markedWriterIndex中
resetWriterIndex: 將當前readerIndex設置為markedWriterIndex
3)slice:
返回當前ByteBuf的可讀子緩沖區,即從readerIndex到writerIndex的ByteBuf,返回的ByteBuf和原有緩沖區***享內容,但是維護獨立的索引.當修改其中壹個ByteBuf的內容時,另壹個也會改變,即雙方持有的是同壹個對象的引用
常見類:
相比於PooledHeapByteBuf,UnpooledHeapByteBuf的實現更加簡單,也不容易出現內存管理的問題,所以才性能滿足的情況下,推薦使用UnpooledHeapByteBuf
在I/O通信線程的讀寫緩沖區中使用DirectByteBuf,後端業務消息的編碼使用HeapByteBuf,這樣的組合性能最優