DataInputStream.readLong()按大端序读取8字节并组装为long值,第1字节为最高有效字节(bit 56–63),第8字节为最低有效字节(bit 0–7);不支持小端,需手动反转字节序处理。

DataInputStream.readLong() 从输入流中读取 8 个字节,并按大端序(Big-Endian)将其解释为一个 long 值——即最高有效字节(MSB)在前,最低有效字节(LSB)在后。
字节序决定字节如何“拼装”成数值
Java 所有内置的 readXxx() 方法(包括 readLong())都严格遵循网络字节序(即大端序)。这意味着:
- 第 1 个读到的字节作为
long的高 8 位(bit 56–63) - 第 2 个字节作为 bit 48–55
- ……依此类推
- 第 8 个字节作为低 8 位(bit 0–7)
例如,若流中连续 8 字节为:0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,则 readLong() 返回值为:
底层拼装逻辑(等效实现)
该方法内部行为可近似理解为以下步骤(忽略异常和阻塞细节):
立即学习“Java免费学习笔记(深入)”;
- 依次调用
readByte()八次,得到b0到b7 - 计算:
((b0 & 0xFFL) << 56) | ((b1 & 0xFFL) << 48) | ... | (b7 & 0xFFL) - 注意:每个
byte被提升为long并与0xFFL按位与,避免符号扩展污染高位
遇到小端数据怎么办?
DataInputStream 不支持小端读取。若源数据是小端(如某些 C 程序或硬件协议输出),需手动反转字节顺序:
- 先用
readFully(byte[8])读入字节数组 - 将数组倒序(
bytes[0]↔bytes[7],bytes[1]↔bytes[6],以此类推) - 再用
ByteBuffer.wrap(reversed).getLong()或手动移位解析
与 ByteBuffer 的对比
ByteBuffer 支持切换字节序:buffer.order(ByteOrder.LITTLE_ENDIAN);而 DataInputStream 固定大端,不可配置。这是设计定位差异——前者面向灵活二进制操作,后者面向标准 Java 数据序列化(如配合 DataOutputStream 使用)。


















