Java NIO之Buffer

Buffer是固定大小的數據的容器,其作用是一個存儲器,或者分段運輸區,在這裏數據可被存儲並在之後用於檢索。緩衝區的工作與通道緊密聯繫,待傳遞出去的數據被置於一個緩衝區,被傳送到通道;待傳回的緩衝區的傳輸,一個通道將數據放置在所提供的緩衝區中。這種在協同對象之間進行的緩衝區數據傳遞是高效數據處理的關鍵。

Buffer類的層次圖
下圖是Buffer類的層次圖。在頂部是通用Buffer類,Buffer定義所有緩衝區類型共有的操作,無論是它們所包含的數據類型還是可能具有的特定行爲:
Java NIO之Buffer

Buffer的屬性
緩衝區是包在一個對象內的基本數據元素數組。Buffer類相比一個簡單數組的優點是它將關於數據的數據內容和信息包含在一個單一的對象中,Buffer類以及它專有的子類定義了一個用於處理數據緩衝區的API。所有的緩衝區都具有四個屬性來提供關於其所包含的數據元素的信息:

屬 性 作 用
capacity 容量,指緩衝區能夠容納的數據元素的最大數量,這一容量在緩衝區創建時被設定,並且永遠不能被改變
limit 上界,指緩衝區的第一個不能被讀或寫的元素,或者說是,緩衝區中現存元素的計數
position 位置,指下一個要被讀或寫的元素的索引,位置會自動由相應的get()和put()函數更新
mark 標記,指一個備忘位置,調用mark()來設定mark=position,調用reset()來設定postion=mark,標記未設定前是未定義的
下面簡單介紹幾個常用方法調用後,屬性的變化。開闢一個起始容量爲10的緩衝區:

Java NIO之Buffer
put() 方法
Java NIO之Buffer

flip() 方法,將Buffer從寫模式切換到讀模式
Java NIO之Buffer

image.png

rewind()方法,將position設回0,limit保持不變,用於重讀Buffer中的所有數據
Java NIO之Buffer

Buffer讀寫模式下屬性的變化
Java NIO之Buffer

Buffer的使用
最後以一段代碼,簡單介紹以下Buffer的使用

public class TestMain
{
/**

  • 待顯示的字符串
    */
    private static String[] strs =
    {
    "Hello World"
    };

    /**

    • 標識strs的下標索引
      */
      private static int index = 0;

      /**

    • 向Buffer內放置數據
      */
      private static boolean fillBuffer(CharBuffer buffer)
      {
      if (index >= strs.length)
      return false;

      String str = strs[index++];
      for (int i = 0; i < str.length(); i++)
      {
      buffer.put(str.charAt(i));
      }

      return true;
      }

      /**

    • 從Buffer內把數據拿出來
      */
      private static void drainBuffer(CharBuffer buffer)
      {
      while (buffer.hasRemaining())
      {
      System.out.print(buffer.get());
      }
      System.out.println("");
      }

      public static void main(String[] args)
      {
      CharBuffer cb = CharBuffer.allocate(100);
      while (fillBuffer(cb))
      {
      cb.flip();
      drainBuffer(cb);
      cb.clear();
      }
      }
      }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章