緩衝區是 Java NIO 非阻塞 I/O 的核心資料容器。本文詳細說明 get()/put() 方法的三種使用模式:按順序讀寫單個元素、指定位置讀寫單個元素、批量讀寫資料塊,並闡述 position、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 可模擬動態大小緩衝區,避免分配過大記憶體。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 的基礎。