- 已知的所有子接口:
-
ImageInputStream,ImageOutputStream,ObjectInput
- 已知的所有实现类:
-
DataInputStream,FileCacheImageInputStream,FileCacheImageOutputStream,FileImageInputStream,FileImageOutputStream,ImageInputStreamImpl,ImageOutputStreamImpl,MemoryCacheImageInputStream,MemoryCacheImageOutputStream,ObjectInputStream,RandomAccessFile
DataInput 接口提供了从二进制流中读取字节并从中重建任何Java原始类型数据的功能。还提供了一种从 修改的UTF-8 格式数据中重建 String 的方法。
通常情况下,该接口中的所有读取例程都是这样的:如果在读取所需字节数之前到达文件末尾,则会抛出一个 EOFException(这是一种 IOException)。如果由于除文件末尾之外的任何原因而无法读取任何字节,则会抛出一个除 EOFException 之外的 IOException。特别地,如果输入流已关闭,则可能会抛出一个 IOException。
修改的UTF-8
DataInput 和 DataOutput 接口的实现以一种略微修改的UTF-8格式表示Unicode字符串。(有关标准UTF-8格式的信息,请参阅《Unicode标准,版本4.0》的第3.9节“Unicode编码形式”)
- 范围在
'\u0001'到'\u007F'的字符由一个字节表示。 - 空字符
'\u0000'和范围在'\u0080'到'\u07FF'的字符由两个字节表示。 - 范围在
'\u0800'到'\uFFFF'的字符由三个字节表示。
| 值 | 字节 | 位值 | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
\u0001 到 \u007F |
1 | 0 | 位6-0 | ||||||
\u0000,\u0080 到 \u07FF |
1 | 1 | 1 | 0 | 位10-6 | ||||
| 2 | 1 | 0 | 位5-0 | ||||||
\u0800 到 \uFFFF |
1 | 1 | 1 | 1 | 0 | 位15-12 | |||
| 2 | 1 | 0 | 位11-6 | ||||||
| 3 | 1 | 0 | 位5-0 | ||||||
该格式与标准UTF-8格式之间的差异如下:
- 空字节
'\u0000'以2字节格式编码,而不是1字节,因此编码的字符串中不会有嵌入的空字节。 - 仅使用1字节、2字节和3字节格式。
- 补充字符 以代理对的形式表示。
- 自:
- 1.0
- 参见:
-
Method Summary
Modifier and TypeMethodDescriptionboolean读取一个输入字节,并在该字节为非零时返回true,在该字节为零时返回false。bytereadByte()读取并返回一个输入字节。charreadChar()读取两个输入字节并返回一个char值。double读取八个输入字节并返回一个double值。float读取四个输入字节并返回一个float值。voidreadFully(byte[] b) 从输入流中读取一些字节并将它们存储到缓冲区数组b中。voidreadFully(byte[] b, int off, int len) 从输入流中读取len个字节。intreadInt()读取四个输入字节并返回一个int值。readLine()从输入流中读取下一行文本。longreadLong()读取八个输入字节并返回一个long值。short读取两个输入字节并返回一个short值。int读取一个输入字节,将其零扩展为类型int,并返回结果,因此结果在0到255的范围内。int读取两个输入字节并返回一个int值,范围在0到65535。readUTF()以使用 修改的UTF-8 格式编码的字符串形式读取。intskipBytes(int n) 尝试跳过输入流中的n个字节的数据,丢弃已跳过的字节。
-
Method Details
-
readFully
从输入流中读取一些字节并将它们存储到缓冲区数组b中。读取的字节数等于b的长度。此方法会阻塞,直到发生以下情况之一:
- 有
b.length字节的输入数据可用,此时会正常返回。 - 检测到文件末尾,此时会抛出一个
EOFException。 - 发生I/O错误,此时会抛出一个除
EOFException之外的IOException。
如果
b是null,则会抛出一个NullPointerException。如果b.length为零,则不会读取任何字节。否则,第一个读取的字节存储在元素b[0]中,下一个字节存储在b[1]中,依此类推。如果从此方法中抛出异常,则可能是b的一些但不是全部字节已更新为来自输入流的数据。- 参数:
-
b- 要读取数据的缓冲区。 - 抛出:
-
NullPointerException- 如果b为null。 -
EOFException- 如果此流在读取所有字节之前到达末尾。 -
IOException- 如果发生I/O错误。
- 有
-
readFully
从输入流中读取len个字节。此方法会阻塞,直到发生以下情况之一:
- 有
len字节的输入数据可用,此时会正常返回。 - 检测到文件末尾,此时会抛出一个
EOFException。 - 发生I/O错误,此时会抛出一个除
EOFException之外的IOException。
如果
b是null,则会抛出一个NullPointerException。如果off为负数,或者len为负数,或者off+len大于数组b的长度,则会抛出一个IndexOutOfBoundsException。如果len为零,则不会读取任何字节。否则,第一个读取的字节存储在元素b[off]中,下一个字节存储在b[off+1]中,依此类推。读取的字节数最多等于len。- 参数:
-
b- 读取数据的缓冲区。 -
off- 指定数据数组b中的偏移量。 -
len- 指定要读取的字节数。 - 抛出:
-
NullPointerException- 如果b为null。 -
IndexOutOfBoundsException- 如果off为负数,len为负数,或len大于b.length - off。 -
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
- 有
-
skipBytes
尝试跳过输入流中的n字节数据,丢弃跳过的字节。但是,它可能跳过一些较少数量的字节,可能为零。这可能是由多种条件引起的;在跳过n字节之前到达文件结尾只是其中一种可能性。此方法永远不会抛出EOFException。返回实际跳过的字节数。- 参数:
-
n- 要跳过的字节数。 - 返回:
- 实际跳过的字节数。
- 抛出:
-
IOException- 如果发生I/O错误。
-
readBoolean
读取一个输入字节,如果该字节为非零则返回true,如果该字节为零则返回false。此方法适用于读取由接口DataOutput的writeBoolean方法写入的字节。- 返回:
-
读取的
boolean值。 - 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readByte
读取并返回一个输入字节。该字节被视为范围在-128到127之间的有符号值。此方法适用于读取由接口DataOutput的writeByte方法写入的字节。- 返回:
- 读取的8位值。
- 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readUnsignedByte
读取一个输入字节,将其零扩展为类型int,并返回结果,因此结果在0到255的范围内。此方法适用于读取由接口DataOutput的writeByte方法写入的字节,如果writeByte的参数旨在是0到255范围内的值。- 返回:
- 读取的无符号8位值。
- 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readShort
读取两个输入字节并返回一个short值。设a为第一个读取的字节,b为第二个字节。返回的值为:
此方法适用于读取由接口(short)((a << 8) | (b & 0xff))DataOutput的writeShort方法写入的字节。- 返回:
- 读取的16位值。
- 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readUnsignedShort
读取两个输入字节并返回一个int值,范围在0到65535之间。设a为第一个读取的字节,b为第二个字节。返回的值为:
此方法适用于读取由接口(((a & 0xff) << 8) | (b & 0xff))DataOutput的writeShort方法写入的字节,如果writeShort的参数旨在是0到65535范围内的值。- 返回:
- 读取的无符号16位值。
- 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readChar
读取两个输入字节并返回一个char值。设a为第一个读取的字节,b为第二个字节。返回的值为:
此方法适用于读取由接口(char)((a << 8) | (b & 0xff))DataOutput的writeChar方法写入的字节。- 返回:
-
读取的
char值。 - 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readInt
读取四个输入字节并返回一个int值。设a-d为第一个到第四个读取的字节。返回的值为:
此方法适用于读取由接口(((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | (d & 0xff))DataOutput的writeInt方法写入的字节。- 返回:
-
读取的
int值。 - 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readLong
读取八个输入字节并返回一个long值。设a-h为第一个到第八个读取的字节。返回的值为:(((long)(a & 0xff) << 56) | ((long)(b & 0xff) << 48) | ((long)(c & 0xff) << 40) | ((long)(d & 0xff) << 32) | ((long)(e & 0xff) << 24) | ((long)(f & 0xff) << 16) | ((long)(g & 0xff) << 8) | ((long)(h & 0xff)))此方法适用于读取由接口
DataOutput的writeLong方法写入的字节。- 返回:
-
读取的
long值。 - 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readFloat
读取四个输入字节并返回一个float值。它首先以readInt方法的方式构造一个int值,然后将此int值转换为float,方法与Float.intBitsToFloat方法完全相同。此方法适用于读取由接口DataOutput的writeFloat方法写入的字节。- 返回:
-
读取的
float值。 - 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readDouble
读取八个输入字节并返回一个double值。它首先以readLong方法的方式构造一个long值,然后将此long值转换为double,方法与Double.longBitsToDouble方法完全相同。此方法适用于读取由接口DataOutput的writeDouble方法写入的字节。- 返回:
-
读取的
double值。 - 抛出:
-
EOFException- 如果在读取所有字节之前流到达结尾。 -
IOException- 如果发生I/O错误。
-
readLine
从输入流中读取下一行文本。它读取连续的字节,将每个字节单独转换为字符,直到遇到行终止符或文件结束;然后将读取的字符作为String返回。请注意,因为此方法处理字节,所以不支持完整Unicode字符集的输入。如果在读取任何字节之前遇到文件结束,则返回
null。否则,读取的每个字节都将通过零扩展转换为char类型。如果遇到字符'\n',则将其丢弃并停止读取。如果遇到字符'\r',则将其丢弃,并且如果接下来的字节转换为字符'\n',则也将其丢弃;然后停止读取。如果在遇到字符'\n'和'\r'之一之前遇到文件结束,则停止读取。一旦停止读取,将返回一个String,其中包含所有读取但未丢弃的字符,按顺序取出。请注意,此字符串中的每个字符的值都小于\u0100,即(char)256。- 返回:
-
从输入流中读取的下一行文本,如果在读取任何字节之前遇到文件结束,则返回
null。 - 抛出:
-
IOException- 如果发生I/O错误。
-
readUTF
读取使用修改后的UTF-8格式编码的字符串。readUTF的一般约定是,它读取以修改后的UTF-8格式编码的Unicode字符字符串的表示形式;然后将这些字符作为String返回。首先,读取两个字节并使用它们构造一个无符号的16位整数,方法与
readUnsignedShort方法完全相同。这个整数值称为UTF长度,并指定要读取的附加字节数。然后通过将它们分组来将这些字节转换为字符。每个组的长度从组的第一个字节的值计算。组后面的字节(如果有)是下一组的第一个字节。如果组的第一个字节匹配位模式
0xxxxxxx(其中x表示"可能是0或1"),则该组只包含该字节。该字节被零扩展以形成一个字符。如果组的第一个字节匹配位模式
110xxxxx,则该组由该字节a和第二个字节b组成。如果没有字节b(因为字节a是要读取的最后一个字节之一),或者字节b不匹配位模式10xxxxxx,则抛出UTFDataFormatException。否则,该组转换为字符:
如果组的第一个字节匹配位模式(char)(((a & 0x1F) << 6) | (b & 0x3F))1110xxxx,则该组由该字节a和另外两个字节b和c组成。如果没有字节c(因为字节a是要读取的最后两个字节之一),或者字节b或字节c不匹配位模式10xxxxxx,则抛出UTFDataFormatException。否则,该组转换为字符:
如果组的第一个字节匹配模式(char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F))1111xxxx或模式10xxxxxx,则抛出UTFDataFormatException。如果在整个过程中任何时候遇到文件结束,则抛出
EOFException。通过这个过程将每个组转换为字符后,按照它们对应的组从输入流中读取的顺序,将字符收集起来,形成一个
String,然后返回。接口
DataOutput的writeUTF方法可用于写入适合由此方法读取的数据。- 返回:
- 一个Unicode字符串。
- 抛出:
-
EOFException- 如果在读取所有字节之前此流到达结尾。 -
IOException- 如果发生I/O错误。 -
UTFDataFormatException- 如果字节不表示字符串的有效修改后的UTF-8编码。
-