java nio 中 bytebuffer 的字节序通过调用 order(byteorder) 方法设置,默认是大端(big_endian),可切换为小端(little_endian)。该方法返回当前 buffer 实例本身,支持链式调用。设置后,后续读写基本类型数据时将遵循新指定的字节序。

如何创建并设置 ByteBuffer 的字节序
可以通过静态工厂方法创建堆缓冲区或直接缓冲区,然后立即调用 order() 指定字节序。例如,创建一个容量为 16 的堆缓冲区并设置为小端模式。这样在写入整数时,低位字节会存放在低地址。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class ByteOrderExample {
public static void main(String[] args) {
// 创建堆缓冲区,默认大端
ByteBuffer buffer = ByteBuffer.allocate(16);
// 设置为小端
buffer.order(ByteOrder.LITTLE_ENDIAN);
// 写入一个整数 0x01020304
buffer.putInt(0x01020304);
// 打印字节内容
buffer.flip();
while (buffer.hasRemaining()) {
System.out.printf("%02X ", buffer.get() & 0xFF);
}
// 输出: 04 03 02 01
}
}
字节序对不同类型数据的影响
字节序设置会影响所有基本类型的读写操作,包括 int、long、float、double 等。对于单字节类型如 byte,字节序无影响。当缓冲区被共享或传递给其他组件时,字节序状态会保留,需确保接收方理解该字节序。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class MultiTypeExample {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(32);
buffer.order(ByteOrder.BIG_ENDIAN);
buffer.putInt(1);
buffer.putLong(2L);
buffer.putFloat(3.0f);
buffer.putDouble(4.0d);
buffer.flip();
System.out.println("Int: " + buffer.getInt());
System.out.println("Long: " + buffer.getLong());
System.out.println("Float: " + buffer.getFloat());
System.out.println("Double: " + buffer.getDouble());
}
}
基于程序中某个输入、条件或结果的具体问题
如果程序中使用 ByteBuffer.wrap(byte[]) 创建缓冲区,其初始字节序为大端。若后续需要小端,必须显式调用 order(ByteOrder.LITTLE_ENDIAN)。否则,读写多字节数据时会得到错误结果。例如,读取网络数据包时,若协议规定小端,但未设置字节序,将导致解析错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











