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

Merlin 新 I/O (NIO) 緩衝區詳解:從基礎到內存映射文件

     編輯:Java 相關知識

緩衝區基礎

J2SE 1.4 引入 java.nio 套件,核心為抽象 Buffer 類。Buffer 類似內存中的 RandomAccessFile,支援基本數據類型讀寫。下一操作位置由 position() 指示,讀寫後位置前移。四個關鍵指標方法:

  • capacity():緩衝區大小
  • limit():已填充字節數,可用 limit(int) 修改
  • position():下一讀寫位置
  • mark()/reset():標記/恢復位置

基本操作 get()/put() 在子類中針對各類型重載。範例:寫入字符 'A' 後 flip() 交換 limit 和 position 並歸零位置,便可讀回。

CharBuffer buff = ...;
buff.put('A');
buff.flip();
char c = buff.get(); // 讀回 'A'

七種基本緩衝區類型

對應七種基本類型(除 boolean):ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer。第八種 MappedByteBuffer 用於內存映射文件。若需其他類型,可從 ByteBuffer 獲取字節再轉換。

靜態工廠方法創建緩衝區(無構造函數)。如 CharBuffer.wrap(string) 將字串轉為 CharBuffer。範例遍歷命令行參數字符:

CharBuffer buff = CharBuffer.wrap(args[0]);
for (int i=0, n=buff.length(); i

直接 vs 間接緩衝區

創建時可要求直接緩衝區(ByteBuffer.allocateDirect()),創建成本較高但運行時可直接進行本地 I/O,適合長生命周期緩衝區。僅能在 ByteBuffer 層面創建直接緩衝區,其他類型需轉換。範例同前但用直接緩衝區:

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(size*2); // char 佔 2 字節
CharBuffer buff = byteBuffer.asCharBuffer();
buff.put(arg);
buff.rewind(); // 位置歸零以便讀取
for (int i=0; i

內存映射文件

MappedByteBuffer 將文件區域直接映射到內存。透過 FileChannel.map() 獲取,FileChannel 可從 FileInputStream/FileOutputStream 獲取。需指定映射模式(只讀/讀寫/私有)、起始位置、長度。讀取文本文件需處理字符集轉換:

FileInputStream fis = new FileInputStream(filename);
FileChannel channel = fis.getChannel();
MappedByteBuffer byteBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
Charset charset = Charset.forName("ISO-8859-1");
CharBuffer charBuffer = charset.newDecoder().decode(byteBuffer);
for (int i=0, n=charBuffer.length(); i

結語

NIO 緩衝區從根本改變 Java I/O 處理方式。掌握 get/put 到內存映射文件讀寫,仍需深入學習通道、選擇器等進階主題。

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