调用 bytebuffer 的 getshort() 方法可以直接从当前缓冲区位置读取一个 16 位短整型数据,并将缓冲区位置指针向后移动两个字节。该方法默认使用缓冲区的字节序(order()),若需指定字节序可先调用 order(byteorder) 设置,再执行读取操作。

getShort() 在直接缓冲区与堆缓冲区中的行为差异
无论缓冲区类型如何,getShort() 均按顺序读取两个字节并返回 short 值,但直接缓冲区(Direct Buffer)涉及非堆内存访问,性能通常更高且不受 GC 影响;堆缓冲区(Heap Buffer)则基于内部数组,可通过 array() 访问原始数据。两者在读取逻辑上完全一致,区别仅在于底层存储位置和内存管理方式。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class ByteBufferGetShortDemo {
public static void main(String[] args) {
// 创建堆缓冲区并写入测试数据
ByteBuffer heapBuf = ByteBuffer.allocate(8);
heapBuf.order(ByteOrder.BIG_ENDIAN);
heapBuf.putShort((short) 0x1234);
heapBuf.putShort((short) 0x5678);
heapBuf.flip();
// 读取第一个 short
short val1 = heapBuf.getShort();
System.out.println("First short: " + Integer.toHexString(val1 & 0xFFFF));
// 读取第二个 short
short val2 = heapBuf.getShort();
System.out.println("Second short: " + Integer.toHexString(val2 & 0xFFFF));
// 创建直接缓冲区并写入相同数据
ByteBuffer directBuf = ByteBuffer.allocateDirect(8);
directBuf.order(ByteOrder.LITTLE_ENDIAN);
directBuf.putShort((short) 0xAABB);
directBuf.putShort((short) 0xCCDD);
directBuf.flip();
short val3 = directBuf.getShort();
System.out.println("Direct buffer (LE) first short: " + Integer.toHexString(val3 & 0xFFFF));
}
}
预期输出:
First short: 1234
Second short: 5678
Direct buffer (LE) first short: bbaa
getShort(int index) 与相对读取的区别
getShort(int index) 是绝对读取方法,不会改变缓冲区的位置指针(position),允许随机访问任意位置的 short 值。而相对读取的 getShort() 每次调用都会递增 position,适用于顺序处理数据流。当需要多次读取同一位置或交错读取不同偏移量时,应使用绝对版本。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class AbsoluteVsRelativeGetShort {
public static void main(String[] args) {
ByteBuffer buf = ByteBuffer.allocate(8);
buf.order(ByteOrder.BIG_ENDIAN);
buf.putShort((short) 0x1111);
buf.putShort((short) 0x2222);
buf.putShort((short) 0x3333);
buf.putShort((short) 0x4444);
buf.flip();
// 相对读取:position 从 0 移动到 2
short r1 = buf.getShort(); // reads at pos 0, pos becomes 2
System.out.println("Relative read 1: " + Integer.toHexString(r1 & 0xFFFF));
// 绝对读取:不改变 position
short a1 = buf.getShort(0); // reads at index 0, pos remains 2
System.out.println("Absolute read at 0: " + Integer.toHexString(a1 & 0xFFFF));
short a2 = buf.getShort(2); // reads at index 2, pos still 2
System.out.println("Absolute read at 2: " + Integer.toHexString(a2 & 0xFFFF));
// 再次相对读取:从当前 position=2 开始
short r2 = buf.getShort(); // reads at pos 2, pos becomes 4
System.out.println("Relative read 2: " + Integer.toHexString(r2 & 0xFFFF));
}
}
预期输出:
Relative read 1: 1111
Absolute read at 0: 1111
Absolute read at 2: 2222
Relative read 2: 2222
当缓冲区剩余空间不足两个字节时 getShort() 会抛出什么异常
如果调用 getShort() 时缓冲区中剩余可读字节数少于 2,将抛出 java.nio.BufferUnderflowException。这是 NIO 缓冲区的标准边界检查机制,确保不会越界读取。在使用前可通过 remaining() >= 2 进行预判,避免异常中断流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











