java io DataInputStream源码分析

本文详细探讨了 Java 中 DataInputStream 类的内部实现,包括构造函数、关键字段如 bytearr 和 chararr 的作用。文章重点分析了 read 方法、readFully 方法、skipBytes 方法,以及读取不同字节数的数值方法,如 readBoolean、readByte 等。此外,还讲解了 readLong、readFloat、readDouble 方法和 readLine、readUTF 方法的使用。
摘要由CSDN通过智能技术生成

目录

简介

构造函数,字段bytearr,chararr

两个read方法,两个readFully方法,skipBytes方法

读取单个或两个或四个字节的方法,readBoolean/Byte/UnsignedByte/Short/UnsignedShort/Char/Int

字段readBuffer和读取8个字节的长数字方法readLong/Float/Double

字段lineBuffer和readLine方法和两个readUTF方法


简介

package java.io;

/**
 * 数据输入流允许应用程序以与机器无关的方式从底层输入流中读取原始Java数据类型。
 * 应用程序使用数据输出流来写入数据,这些数据稍后可由数据输入流读取。
 * <p>
 * DataInputStream对于多线程访问不一定是安全的。
 * 线程安全是可选的,是这个类中方法的用户的责任。
 *
 * @author  Arthur van Hoff
 * @see     java.io.DataOutputStream
 * @since   JDK1.0
 */
public
class DataInputStream extends FilterInputStream implements DataInput

构造函数,字段bytearr,chararr

    /**
     * 使用指定的底层InputStream,创建DataInputStream。
     *
     * @param  in   the specified input stream
     */
    public DataInputStream(InputStream in) {
        super(in);
    }

    /**
     * 由于需要readUTF,初始化时创建工作数组
     */
    private byte bytearr[] = new byte[80];
    private char chararr[] = new char[80];

两个read方法,两个readFully方法,skipBytes方法

    /**
     * 从包含的输入流中读取一定数量的字节,并将其存储到缓冲区数组b中。
     * 实际读取的字节数作为整数返回。
     * 此方法会阻塞,直到输入数据可用、检测到文件结束或抛出异常为止。
     *
     * <p>如果b为null,则抛出NullPointerException。
     * 如果b的长度为0,则不读入字节,返回0;
     * 否则,将有一个试图读取至少一个字节。
     * 如果流位于文件的末尾,因此没有可用的字节,则返回-1;
     * 否则,至少有一个字节被读取并存储到b中。
     *
     * <p>读取的第一个字节被存储到元素b[0]中,然后下一个字节存储到元素b[1]中,以此类推。
     * 读取的字节数,最多等于b的长度。设k为实际读取的字节数;
     * 这些字节将存储在元素b[0]到b[k-1]中,而不影响元素b[k]到b[b.length-1]。
     *
     * <p>read(b)方法的效果如下:<pre>
     * read(b, 0, b.length)
     * </pre></blockquote>
     *
     * @param      b   the buffer into which the data is read.
     * @return     the total number of bytes read into the buffer, or
     *             <code>-1</code> if there is no more data because the end
     *             of the stream has been reached.
     * @exception  IOException if the first byte cannot be read for any reason
     * other than end of file, the stream has been closed and the underlying
     * input stream does not support reading after close, or another I/O
     * error occurs.
     * @see        java.io.FilterInputStream#in
     * @see        java.io.InputStream#read(byte[], int, int)
     */
    public final int read(byte b[]) throws IOException {
        return in.read(b, 0, b.length);
    }

    /**
     * 从包含的输入流中读取最多len字节的数据到字节数组中。
     * 尝试读取尽可能多的len字节,但可能会读取更小的数字,可能为零。
     * 实际读取的字节数以整数的形式返回。
     *
     * <p> 此方法将一直阻塞,直到输入数据可用、检测到文件结束或抛出异常为止。
     *
     * <p> 如果len是零,那么没有字节被读取和返回0;
     * 否则,将尝试读取至少一个字节。
     * 如果没有字节可用,因为流在结束文件,值-1被返回;
     * 否则,至少有一个字节被读取并存储到b中。
     *
     * <p> 读取的第一个字节被存储到元素b[off]中,第二个字节存储到元素b[off+1]中,以此类推。
     * 读取的字节数,最多等于len。设k是实际读取的字节数;
     * 这些字节将被存储在元素b[off]到b[off+k-1]中,而元素b[off+k]到b[off+len-1]不受影响。
     *
     * <p> 在每种情况下,元素b[0]到b[off]和元素b[off+len]到b[b.length-1]不受影响。
     *
     * @param      b     the buffer into which the data is read.
     * @param off the start offset in the destination array <code>b</code>
     * @param      len   the maximum number of bytes read.
     * @return     the total number of bytes read into the buffer, or
     *             <code>-1</code> if there is no more data because the end
     *             of the stream has been reached.
     * @exception  NullPointerException If <code>b</code> is <code>null</code>.
     * @exception  IndexOutOfBoundsException If <code>off</code> is negative,
     * <code>len</code> is negative, or <code>len</code> is greater than
     * <code>b.length - off</code>
     * @exception  IOException if the first byte cannot be read for any reason
     * other than end of file, the stream has been closed and the underlying
     * input stream does not support reading after close, or another I/O
     * error occurs.
     * @see        java.io.FilterInputStream#in
     * @see        java.io.InputStream#read(byte[], int, int)
     */
    public final int read(byte b[], int off, int len) throws IOException {
        return in.read(b, off, len);
    }

    /**
     * 参见DataInput的readFully方法的一般约定。
     * <p>
     * 从包含的输入流中读取此操作的字节。
     *
     * @param      b   the buffer into which the data is read.
     * @exception  EOFException  if this input stream reaches the end before
     *             reading all the bytes.
     * @exception  IOException   the stream has been closed and the contained
     *             input stream does not support reading after close, or
     *             another I/O error occurs.
     * @see        java.io.FilterInputStream#in
     */
    public final void readFully(byte b[]) throws IOException {
        readFully(b, 0, b.length);
    }

    /**
     * 参见DataInput的readFully方法的一般约定。
     * <p>
     * 从包含的输入流中读取此操作的字节。
     *
     * @param      b     the buffer into which the data is read.
     * @param      off   the start offset of the data.
     * @param      len   the number of bytes to read.
     * @exception  EOFException  if this input stream r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值