DataInputStream是java IO装饰模式的一种实现,设计的目的是读取基本的java数据类型,需要强调的是DataInputStream也不是线程安全的,它继承了FilterInputStream抽象类,同时实现了DataInput接口,这个接口的主要作用是读取字节类型的数据并将数据重新构造为java的基本类型.对于DataInput接口如果在读取所需字节数据之前已经达到末尾,则会抛出了EOFException,其它情况下会抛出IOException,接下来我们一个个分析具体的方法
readFully
readFully在DataInpuStream中非常重要,它用于读取指定字节数,并将读到的字节进行合理的位运算处理转化为boolean,int,unsigned int或者long类型,下面是DataInputStream实现DataInput接口的readFully方法
它从in流中读取len长度的字节,如果in流中长度不足len则会抛出EoFException
public final void readFully(byte b[], int off, int len) throws IOException {
if (len < 0)
throw new IndexOutOfBoundsException();
int n = 0;
//如果没有读到len长度,始终循环读取
while (n < len) {
int count = in.read(b, off + n, len - n);
if (count < 0)
throw new EOFException();
n += count;
}
}
在进一步分析读取基本类型数据之前,我们先java了解这些基本类型所占的字节长度
类型 | 长度 |
---|---|
int | 4 |
short | 2 |
long | 8 |
byte | 1 |
float | 4 |
double | 8 |
char | 2 |
boolean | 1 |
readBoolean用于读取布尔型数据
0代表false,1代表true
public final boolean readBoolean() throws IOException {
int ch = in.read();
if (ch < 0)
throw new EOFException();
return (ch != 0);
}
readShort
public final short readShort() throws IOException {
//首先读取两个字节ch1,ch2
int ch1 = in.read();
int ch2 = in.read();
//如果in读到了字节,那么数据处于0~255
//如果in没有读数据,那么数据为-1,
//-1与任何数进行按位或计算都返回<0
if ((ch1 | ch2) < 0)
throw new EOFException();
//因为short类型是16位,所以ch1需要左移放大2^8倍,第二个字节不变
return (short)((ch1 << 8) + (ch2 << 0));
}
readUnsignedShort
与readShort不同的是读取的数据是无符号型,所以不需要强制转换
public final int readUnsignedShort() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
if ((ch1 | ch2) < 0)
throw new EOFException();
return (ch1 << 8) + (ch2 << 0);
}
readLong
0,1,2,3,4位是高位,左移后可能超过Long的最大值所以需要强制转换
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));
}
readFloat
public final float readFloat() throws IOException {
//待定
return Float.intBitsToFloat(readInt());
}