1.写入一个int
public final void writeInt(int v) throws IOException { out.write((v >>> 24) & 0xFF); out.write((v >>> 16) & 0xFF); out.write((v >>> 8) & 0xFF); out.write((v >>> 0) & 0xFF); incCount(4); }
int 类型的长度是四个字节,从高位开始写入。读取亦之。
第一个字节无符号右移24位(无符号右移即高位补0)。第二个字节无符号右移16位。第三个字节无符号右移8位。第四个字符无符号右移0位。每个字节无符号右移之后与0xFF按位与,这样做高于8位的字节将全部变成0,只剩8位的数字。
比如1000,二进制是11 11101000,相当于分别写入变量 0, 0 , 3, 232。第一次右移24位,则是0x0000 & 0xFF = 0(radix = 10), 第一次右移16位,则是0x0000 & 0xFF = (radix = 10),第三次右移8位,则是0x0011 & 0xFF = 3(radix = 3),第四次右移0位,则是0x03B8 & 0xff = 232(radix = 10)。
public final int readInt() throws IOException { int ch1 = in.read(); int ch2 = in.read(); int ch3 = in.read(); int ch4 = in.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); }
读取int,由高位开始读取。再次进行操作累加即可。亦可通过
(((ch1 & 0xff) << 24) | ((ch2 & 0xff) << 16) | ((ch3 & 0xff) << 8) | (ch4 & 0xff)) 读取写入的值。
2.写入一个long
public final void writeLong(long v) throws IOException { writeBuffer[0] = (byte)(v >>> 56); writeBuffer[1] = (byte)(v >>> 48); writeBuffer[2] = (byte)(v >>> 40); writeBuffer[3] = (byte)(v >>> 32); writeBuffer[4] = (byte)(v >>> 24); writeBuffer[5] = (byte)(v >>> 16); writeBuffer[6] = (byte)(v >>> 8); writeBuffer[7] = (byte)(v >>> 0); out.write(writeBuffer, 0, 8); incCount(8); }与写入int类似,long类型的长度是8个字节,所以移位操作8次。并且每次移位操作之后是先存储在一个私有成员变量字节数组里面。这里没有使用按位与操作位,直接强制转换成byte类型,达到高位被截取的目的。eg:1000,字节数据组数据是0,0,0,0,0,0,3,-24。
public final long readLong() throws IOException { readFully(readBuffer, 0, 8); return (((long)readBuffer[0] << 56) + ((long)(readBuffer[1] & 255) << 48) + ((long)(readBuffer[2] & 255) << 40) + ((long)(readBuffer[3] & 255) << 32) + ((long)(readBuffer[4] & 255) << 24) + ((readBuffer[5] & 255) << 16) + ((readBuffer[6] & 255) << 8) + ((readBuffer[7] & 255) << 0)); }
先读入字节数组。第一个字节不需要与0xFF按位与,因为第一个字节没有被截取高位。后面全部与255按位与。将可以得到那个位置原来的数。比如-24 & 255 = 232。