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

Java NIO 緩衝區讀寫詳解:get/put 方法按序與隨機存取單個元素

     編輯:Java 相關知識

前言

緩衝區是 Java NIO 非阻塞 I/O 的核心資料容器。本文詳細說明 get()/put() 方法的三種使用模式:按順序讀寫單個元素、指定位置讀寫單個元素、批量讀寫資料塊,並闡述 position、limit、capacity 三大屬性的交互關係。

緩衝區基礎屬性

  • capacity:固定容量,建立後不可變。
  • position:下一個要讀寫的元素索引,初始為 0,每次讀寫自動 +1。
  • limit:可讀寫元素的上限(索引),初始等於 capacity,可手動設定以限制可訪問範圍。

一、按順序讀寫單個元素

ByteBuffer buf = ByteBuffer.allocate(6);
buf.put((byte)2);   // position=1
buf.put((byte)-1);  // position=2
buf.position(2);    // 移至索引 2
System.out.println(buf.get()); // 讀取索引 2 的值,position=3

若 position == limit 再讀寫會拋出 BufferOverflowException。

二、指定位置讀寫

使用 position(int newPosition) 移動游標,或 rewind() 歸零。配合 flip() 將 limit 設為目前 position,再 rewind() 即可從頭遍歷已寫入資料:

buf.put((byte)20); buf.put((byte)33);
buf.flip();        // limit=2, position=0
buf.rewind();      // position=0
while (buf.hasRemaining()) System.out.print(buf.get() + " "); // 20 33

三、limit 的進階用法

  • 手動設定 limit 可模擬動態大小緩衝區,避免分配過大記憶體。
  • 遍歷資料建議使用 while(buf.hasRemaining()) 或 while(position() < limit()),勿使用 capacity(),否則在 limit < capacity 時會拋出 BufferUnderflowException。

完整範例程式碼

IntBuffer intBuf = IntBuffer.allocate(10);
intBuf.put(1000).put(2000);
System.out.println("position: " + intBuf.position()); // 2
intBuf.position(1);
System.out.println(intBuf.get()); // 2000
intBuf.rewind();
System.out.println(intBuf.get()); // 1000

ByteBuffer byteBuf = ByteBuffer.allocateDirect(10);
byteBuf.put((byte)20).put((byte)33).flip().rewind();
while (byteBuf.hasRemaining()) System.out.print(byteBuf.get() + " "); // 20 33

CharBuffer charBuf = CharBuffer.wrap("abcdefg");
while (charBuf.hasRemaining()) System.out.print(charBuf.get() + " "); // a b c d e f g

DoubleBuffer dblBuf = DoubleBuffer.wrap(new double[]{1.1, 2.2});
while (dblBuf.position() < dblBuf.limit()) System.out.print(dblBuf.get() + " "); // 1.1 2.2

結語

掌握 position、limit、capacity 的互動關係,配合 flip()、rewind()、hasRemaining(),能靈活控制緩衝區讀寫流程,是高效使用 Java NIO 的基礎。

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