- 已知的所有子接口:
-
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
。byte
readByte()
读取并返回一个输入字节。char
readChar()
读取两个输入字节并返回一个char
值。double
读取八个输入字节并返回一个double
值。float
读取四个输入字节并返回一个float
值。void
readFully
(byte[] b) 从输入流中读取一些字节并将它们存储到缓冲区数组b
中。void
readFully
(byte[] b, int off, int len) 从输入流中读取len
个字节。int
readInt()
读取四个输入字节并返回一个int
值。readLine()
从输入流中读取下一行文本。long
readLong()
读取八个输入字节并返回一个long
值。short
读取两个输入字节并返回一个short
值。int
读取一个输入字节,将其零扩展为类型int
,并返回结果,因此结果在0
到255
的范围内。int
读取两个输入字节并返回一个int
值,范围在0
到65535
。readUTF()
以使用 修改的UTF-8 格式编码的字符串形式读取。int
skipBytes
(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编码。
-