Java NIO的ByteBuffer默认使用大端序,可通过ByteOrder显式切换为小端序以控制多字节数据的字节排列;ByteOrder仅影响putXxx()/getXxx()等多字节操作,不改变单字节值或已写入数据。

Java NIO 的 ByteBuffer 默认使用**大端序(Big-Endian)**,但可通过 ByteOrder 显式切换为小端序(Little-Endian),从而控制多字节数据(如 int、long、float 等)在缓冲区中的字节排列方式。
ByteOrder 的作用与默认行为
ByteOrder 是一个枚举类,提供两个常量:BIG_ENDIAN 和 LITTLE_ENDIAN。它不改变单个字节的值,只影响多字节类型在写入或读取时的**字节布局顺序**。例如:
- 整数
0x12345678(十进制 305419896):- 大端序存储为:
12 34 56 78 - 小端序存储为:
78 56 34 12
- 大端序存储为:
-
ByteBuffer创建后默认 order 为BIG_ENDIAN,所有putInt()、getInt()等方法都按此顺序操作。
设置缓冲区的字节序
通过 order(ByteOrder) 方法可修改缓冲区的字节序,该方法返回当前缓冲区(支持链式调用),且会影响后续所有多字节读写操作:
-
创建时指定:
ByteBuffer buffer = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN); -
创建后修改:
buffer.order(ByteOrder.LITTLE_ENDIAN); - 注意:修改 order 不影响已写入的数据,只影响之后的读写行为。
读写时的实际影响
字节序仅对 putXxx() / getXxx() 方法生效(如 putInt()、getShort()),对 put(byte) 或 array() 无影响:
立即学习“Java免费学习笔记(深入)”;
- 调用
buffer.putInt(0x12345678)前设为LITTLE_ENDIAN→ 缓冲区中连续 4 字节为78 56 34 12 - 随后调用
buffer.getInt()会按相同字节序还原出原值0x12345678 - 若写入和读取使用不同字节序,结果将错误(如写入用小端、读取用大端,得到的是乱码值)
跨平台通信中的典型用法
网络协议(如 TCP/IP)和多数文件格式(如 PNG、ZIP)规定使用大端序;而 x86/x64 CPU 原生为小端序。因此:
- 与网络交互时,通常保持默认
BIG_ENDIAN(符合网络字节序) - 处理本地二进制文件(如 Windows PE、某些音频格式)时,可能需设为
LITTLE_ENDIAN - 可使用
buffer.order() == ByteOrder.BIG_ENDIAN检查当前顺序,避免硬编码假设


















