1. 程式人生 > >Java NIO之Buffer

Java NIO之Buffer

-o 調用 api 方法 屬性 下標索引 在頂部 創建 ebe

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

Buffer類的層次圖
下圖是Buffer類的層次圖。在頂部是通用Buffer類,Buffer定義所有緩沖區類型共有的操作,無論是它們所包含的數據類型還是可能具有的特定行為:
技術分享圖片

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

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

技術分享圖片
put() 方法
技術分享圖片

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

技術分享圖片

image.png

rewind()方法,將position設回0,limit保持不變,用於重讀Buffer中的所有數據
技術分享圖片

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();
      }
      }
      }

Java NIO之Buffer