DataInputStream仅支持大端序,读小端序数据需先readFully再用ByteBuffer设LITTLE_ENDIAN解析;可封装readLeInt等工具方法;或改用FileChannel+ByteBuffer直接设小端序。

DataInputStream 本身只支持大端序(Big-Endian),也就是网络字节序。它所有的 readInt()、readShort()、readLong() 等方法,都按高位在前的方式解析字节,**不提供小端序(Little-Endian)的直接读取能力**。
用 DataInputStream 读小端序数据的通用做法
你需要先用 readXXX() 读出大端序解释的值,再手动翻转字节顺序;或者更推荐:用 DataInputStream.readFully(byte[]) 读原始字节,再用 ByteBuffer 指定字节序解析。
- 读 4 字节 int(小端):
byte[] buf = new byte[4];
dis.readFully(buf);
int value = ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).getInt();
- 读 2 字节 short(小端):
byte[] buf = new byte[2];
dis.readFully(buf);
short value = ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).getShort();
立即学习“Java免费学习笔记(深入)”;
封装成工具方法更方便
可以写几个静态方法复用,避免重复写样板代码:
-
readLeInt(DataInputStream dis)→ 返回 int -
readLeShort(DataInputStream dis)→ 返回 short -
readLeLong(DataInputStream dis)→ 返回 long
每个方法内部都是:分配对应长度的 byte[] → readFully → ByteBuffer 解析。
注意边界和异常处理
readFully 会阻塞直到读满指定字节数,如果流提前结束会抛 EOFException。实际使用时建议包裹 try-catch,或提前检查流是否还有足够字节(比如用 available() 仅作参考,不可靠;更稳妥的是上层协议明确长度)。
替代方案:直接用 ByteBuffer + FileInputStream
如果你能控制输入源,更简洁的方式是跳过 DataInputStream,直接用 FileChannel 或 ByteBuffer 配合 FileInputStream.getChannel().map(...),然后统一设 order(ByteOrder.LITTLE_ENDIAN)。这样所有 getXXX() 都按小端执行,无需每次包装。


















