DataInputStream源代码解读

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了解这些基本类型所占的字节长度

类型长度
int4
short2
long8
byte1
float4
double8
char2
boolean1

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());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值