Java中DataOutputStream的writeInt方法里>>>和&位运算符的作用是什么?
解析DataOutputStream.writeInt()的底层实现逻辑
DataOutputStream.writeInt()的核心作用是将一个32位的Java int值,拆分为4个独立的8位字节,按照**大端字节序(高位字节优先)**写入输出流,以此保证跨平台的数据一致性——无论读取端是什么系统,都能通过DataInputStream.readInt()正确还原出原始int值。
下面结合你示例中的数字4,逐行拆解源码的位操作逻辑:
先明确前提
Java中int是32位有符号整数,数字4的二进制完整表示为:
00000000 00000000 00000000 00000100
我们把这32位从左到右分为4个8位字节:最高有效字节、次高有效字节、次低有效字节、最低有效字节。
1. (v >>> 24) & 0xFF
>>>是无符号右移运算符:将v的所有32位向右移动24位,此时原来的最高8位(第一个字节)会被移到最低8位的位置。对于v=4,右移24位后结果是00000000(二进制)。& 0xFF:用十六进制的0xFF(即二进制11111111)与结果做按位与,目的是清零所有高位,只保留低8位,确保最终得到一个0-255范围内的无符号字节值。- 最终得到:
0x00(十六进制),对应4的最高有效字节。
2. (v >>> 16) & 0xFF
- 右移16位:将
v的所有位向右移动16位,原来的次高8位(第二个字节)移到最低位。4右移16位后仍为00000000。 - 与
0xFF相与后得到:0x00,对应4的次高有效字节。
3. (v >>> 8) & 0xFF
- 右移8位:将
v的所有位向右移动8位,原来的次低8位(第三个字节)移到最低位。4右移8位后还是00000000。 - 与
0xFF相与后得到:0x00,对应4的次低有效字节。
4. (v >>> 0) & 0xFF
- 右移0位等于没有位移,直接取
v的最低8位。4的低8位是00000100,与0xFF相与后得到十进制的4,即十六进制0x04,对应4的最低有效字节。
实际写入结果
当你调用writeInt(4)时,输出流中会依次写入四个字节:0x00, 0x00, 0x00, 0x04,这就是你用二进制编辑器打开test_file.txt能看到的内容。
关于incCount(4)
这个方法的作用是更新DataOutputStream内部的字节计数器,将已写入的总字节数增加4——因为writeInt()固定写入4个字节,方便后续通过size()方法获取已写入的总字节数。
内容的提问来源于stack exchange,提问作者Ken Masters
相关产品推荐
相关产品推荐

