Netty系列4-buffer

(1)buffer
NIO通信中數據不會和通道直接交互。對於讀來說,數據總是先從通道讀到緩衝,應用程序再讀緩衝的數據。對於寫,數據也是先寫入緩衝,再通過通道把緩衝的數據發送出去。
緩衝區本質上是一塊可以讀寫的內存,這塊內存被包裝成NIO Buffer對象,並提供了一組方法來訪問該內存。
(2)重要屬性

  • capacity:Buffer內存塊的大小。一旦Buffer滿了,需要將其清空(通過讀數據或者清除數據)才能繼續寫數據。
  • position:當前的位置。初始的position值爲0。數據讀寫到Buffer後,position會移動到下一個可讀寫數據的Buffer單元。position最大可爲capacity–1。讀取數據時,也是從某個特定位置讀。Buffer從寫模式切換到讀模式,position會被重置爲0。
  • limit:寫模式下,Buffer的limit表示你最多能往Buffer裏寫多少數據。寫模式下,limit等於Buffer的capacity。切換Buffer到讀模式時,limit表示你最多能讀到多少數據,這時候,limi爲寫模式下的position值。
  • (3)方法
  • 每一個Buffer類都有allocate方法在堆上或者直接內存上分配
  • 寫數據到Buffer有兩種方式:讀取Channel寫到Buffer,inChannel.read(buf);通過Buffer的put()方法寫到Buffer,buf.put。flip方法將Buffer從寫模式切換到讀模式。調用flip()方法會將position設回0,並將limit設置成之前position的值
  • 從Buffer中讀取數據有兩種方式:從Buffer讀取數據寫入到Channel, inChannel.write(buf);使用get()方法從Buffer中讀取數據,buf.get()。調用flip()方法從寫模式切換到讀模式
  • 一旦讀完了所有的數據,就需要清空緩衝區,讓它可以再次被寫入。有兩種方式能清空緩衝區:調用clear()或compact()方法。clear()方法會清空整個緩衝區。compact()方法只會清除已經讀過的數據。任何未讀的數據都被移到緩衝區的起始處,新寫入的數據將放到緩衝區未讀數據的後面。
  • mark()與reset():調用Buffer.mark()方法,可以標記Buffer中的一個特定position。之後調用Buffer.reset()方法恢復到這個position。
  • equals():有相同的類型(byte、char、int等);Buffer中剩餘的byte、char等的個數相等; Buffer中所有剩餘的byte、char等都相同;以上三個條件都相等,兩個Buffer相等
  • compareTo():第一個不相等的元素小於另一個Buffer中對應的元素或者所有元素都相等,第一個Buffer的元素個數比另一個少,則Buffer小於另一個Buffer
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章