1. 程式人生 > >Java NiO 緩衝區學習筆記

Java NiO 緩衝區學習筆記

  一、緩衝區(Buffer):在 Java NIO 中負責資料的存取。緩衝區就是陣列。用於儲存不同資料型別的資料

        根據資料型別不同(boolean 除外),提供了相應型別的緩衝區:  ByteBuffer、 CharBuffer、ShortBuffer、 IntBuffer、 LongBuffer、FloatBuffer、 DoubleBuffer

        上述緩衝區的管理方式幾乎一致,通過 allocate() 獲取緩衝區,如 ByteBuffer.allocate(1024);

二、    緩衝區存取資料 核心方法 put() 存入資料到緩衝區中  ;get() 獲取緩衝區中的資料


三、緩衝區的核心屬性:

       capatity 容量 緩衝區最大儲存資料容量,一旦宣告不能改變 ;
        limit:界限,表示緩衝區可以操作資料的大小(limit後資料不能進行讀寫)
        position 位置,表示緩衝區正在操作資料的位置
        mark :標記 表示記錄當前 position 的位置。可以通過 reset() 恢復到 mark 的位置      

  四、直接緩衝區與非直接緩衝區:
  非直接緩衝區:通過 allocate() 方法分配緩衝區,將緩衝區建立在 JVM 的記憶體中
  直接緩衝區:通過 allocateDirect() 方法分配直接緩衝區,將緩衝區建立在實體記憶體中。可以提高效率

程式碼例項

    public void test1(){
   String str="abcde";
   //分配指定大小的緩衝區
ByteBuffer buf=ByteBuffer.allocate(1024);
        System.out.println("");
       //存資料
        buf.put(str.getBytes());
        System.out.println("put");
      System.out.println(buf.position());
      System.out.println(buf.limit());
      System.out.println(buf.capacity());
      
      //切換讀資料模式
      buf.flip();
      //利用get讀取緩衝區資料
      byte[] dst=new byte[buf.limit()];
      buf.get(dst);
      System.out.println(new String(dst,0,dst.length)); 
      System.out.println("get");
      System.out.println(buf.position());
      System.out.println(buf.limit());
      System.out.println(buf.capacity());
      
      //rewind 可重複讀
      buf.rewind();
      System.out.println("rewind");
      System.out.println(buf.position());
      System.out.println(buf.limit());
      System.out.println(buf.capacity());
      
      //clear 清空緩衝區,但是緩衝區資料依然存在
      buf.clear();
      System.out.println("clear");
      System.out.println(buf.position());
      System.out.println(buf.limit());
      System.out.println(buf.capacity());
   }

public void test2(){
   String str="abcde";
   ByteBuffer buf=ByteBuffer.allocate(1024);
   buf.put(str.getBytes());
  //切換讀模式
   buf.flip();
   byte[] bst=new byte[buf.limit()];
   buf.get(bst,0,2);
   System.out.println(new String(bst,0,2));
   System.out.println(buf.position());
   //mark標記
   buf.mark();
   buf.get(bst,2,2);
   System.out.println(new String(bst,2,2));
   System.out.println(buf.position());
   //reset :恢復到mark的位置
   buf.reset();
   System.out.println(buf.position());
     }