首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java NIO 緩衝區建立指南:allocate、wrap、allocateDirect 三種方式詳解

     編輯:Java 相關知識

前言

Java NIO 提供七種基本緩衝區類別(ByteBuffer、ShortBuffer、IntBuffer、CharBuffer、FloatBuffer、DoubleBuffer、LongBuffer),均無公共建構子,需透過靜態工廠方法建立。本文詳細比較 allocate、wrap、allocateDirect 三種建立方式的差異與適用場景。

七大緩衝區類別共同特性

  • 方法簽名對應基本型別(如 IntBuffer.get() 回傳 int)。
  • 皆提供 allocate(int capacity) 與 wrap(array) 靜態方法。
  • capacity() 回傳緩衝區容量(元素個數,非位元組數)。
  • array() 可轉回陣列,但唯讀緩衝區與直接緩衝區不支援,需先用 hasArray() 判斷。

一、allocate(int capacity) - 動態分配

  • 建立空緩衝區,容量上限為 capacity。
  • 底層採堆疊管理,隨資料量動態分配記憶體,capacity 可設極大(如 1M)。
  • 注意:IntBuffer.allocate(1024) 可容納 1024 個 int(4096 位元組),非 1024 位元組。

二、wrap(array) - 封裝現有陣列

  • 將陣列或子陣列(指定 offset、length)零複製封裝為緩衝區。
  • 修改緩衝區即修改原陣列,反之亦然(共享資料)。
  • 子陣列封裝後 capacity() 仍為原陣列長度,非子陣列長度。
int[] arr = {1,2,3,4,5,6};
IntBuffer buf = IntBuffer.wrap(arr, 1, 3); // 封裝索引 1~3
for (int v : buf.array()) System.out.print(v + " "); // 輸出 1 2 3 4 5 6(原陣列全輸出)

三、ByteBuffer 專屬:allocateDirect(int capacity)

  • 一次性分配連續原生記憶體,可提升 I/O 效能(避免 JVM 堆與原生記憶體複製)。
  • 缺點:分配/釋放較慢、非跨平台一致(某 OS 效能差)、無法使用 array()。
  • 用 isDirect() 判斷是否為直接緩衝區。

四、CharBuffer 專屬:封裝字串序列

CharBuffer.wrap(CharSequence) 可接受 String、StringBuffer、StringBuilder、CharBuffer 本身,支援子字串範圍 wrap(csq, start, end)。

CharBuffer cb1 = CharBuffer.wrap("Hello");
CharBuffer cb2 = CharBuffer.wrap(new StringBuffer("World"));
CharBuffer cb3 = CharBuffer.wrap("1234", 1, 3); // "23"

結語

根據效能需求與資料來源選擇建立方式:一般情況用 allocate;已有陣列/字串用 wrap 零複製;極高效能 I/O 且確認平台相容才用 allocateDirect。理解 hasArray()、isDirect() 等檢查方法,避免執行期例外。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved