树叶云鸿蒙OS教程:鸿蒙OS DataInput

DataInput

public interface DataInput

DataInput 接口提供从二进制流中读取字节并从中重建任何 Java 原始类型的数据。 还有一种工具可以从修改后的 UTF-8 格式的数据中重建字符串。

对于该接口中的所有读取例程,通常情况下,如果在读取所需字节数之前到达文件末尾,则会抛出 EOFException(这是一种 IOException)。 如果由于文件结尾以外的任何原因无法读取任何字节,则抛出除 EOFException 之外的 IOException。 特别是,如果输入流已关闭,则可能会引发 IOException。

修改后的 UTF-8

DataInput 和 DataOutput 接口的实现以对 UTF-8 稍作修改的格式表示 Unicode 字符串。 (有关标准 UTF-8 格式的信息,请参阅 Unicode 标准版本 4.0 的第 3.9 节 Unicode 编码形式)。 请注意,在下表中,最高有效位出现在最左侧的列中。

此格式与标准 UTF-8 格式的区别如下:

  • 空字节 ‘\u0000’ 以 2 字节格式而不是 1 字节编码,因此编码的字符串永远不会嵌入空值。
  • 仅使用 1 字节、2 字节和 3 字节格式。
  • 补充字符以代理对的形式表示。

Since:

JDK1.0

方法总结

修饰符和类型方法描述
booleanreadBoolean()读取一个输入字节,如果该字节非零则返回 true,如果该字节为零则返回 false。
bytereadByte()读取并返回一个输入字节。
charreadChar()读取两个输入字节并返回一个 char 值。
doublereadDouble()读取八个输入字节并返回一个双精度值。
floatreadFloat()读取四个输入字节并返回一个浮点值。
voidreadFully(byte[] b)从输入流中读取一些字节并将它们存储到缓冲区数组中 b。
voidreadFully(byte[] b, int off, int len)从输入流中读取 len 个字节。
intreadInt()读取四个输入字节并返回一个 int 值。
StringreadLine()从输入流中读取下一行文本。
longreadLong()读取八个输入字节并返回一个 long 值。
shortreadShort()读取两个输入字节并返回一个短值。
intreadUnsignedByte()读取一个输入字节,将其零扩展为 int 类型,并返回结果,因此该结果在 0 到 255 的范围内。
intreadUnsignedShort()读取两个输入字节并返回 0 到 65535 范围内的 int 值。
StringreadUTF()读取使用修改后的 UTF-8 格式编码的字符串。
intskipBytes(int n)尝试从输入流中跳过 n 个字节的数据,丢弃跳过的字节。

方法详情

readFully

void readFully(byte[] b) throws IOException

从输入流中读取一些字节并将它们存储到缓冲区数组中 b。 读取的字节数等于 b 的长度。

此方法会阻塞,直到发生以下情况之一:

  • b.length 字节的输入数据可用,在这种情况下正常返回。
  • 检测到文件结尾,在这种情况下抛出 EOFException。
  • 发生 I/O 错误,在这种情况下会抛出 EOFException 以外的 IOException。

如果 b 为 null,则抛出 NullPointerException。 如果 b.length 为零,则不读取任何字节。 否则,读取的第一个字节存储到元素 b[0] 中,下一个字节存储到 b[1] 中,依此类推。 如果此方法引发异常,则可能是 b 的某些但不是所有字节已使用来自输入流的数据进行了更新。

参数:

参数名称参数描述
b读取数据的缓冲区。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readFully

void readFully(byte[] b, int off, int len) throws IOException

从输入流中读取 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一个 int,指定数据的偏移量。
len一个 int 指定要读取的字节数。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

skipBytes

int skipBytes(int n) throws IOException

尝试从输入流中跳过 n 个字节的数据,丢弃跳过的字节。 但是,它可能会跳过一些较小的字节数,可能为零。 这可能是由多种情况中的任何一种造成的; 在跳过 n 个字节之前到达文件末尾只是一种可能性。 此方法从不抛出 EOFException。 返回实际跳过的字节数。

参数:

参数名称参数描述
n要跳过的字节数。

返回:

实际跳过的字节数。

Throws:

Throw名称Throw描述
IOException如果发生 I/O 错误。

readBoolean

boolean readBoolean() throws IOException

读取一个输入字节,如果该字节非零则返回 true,如果该字节为零则返回 false。 该方法适用于读取接口DataOutput的writeBoolean方法写入的字节。

返回:

读取的布尔值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readByte

byte readByte() throws IOException

读取并返回一个输入字节。 该字节被视为 -128 到 127(含)范围内的有符号值。 该方法适用于读取接口DataOutput的writeByte方法写入的字节。

返回:

读取的 8 位值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readUnsignedByte

int readUnsignedByte() throws IOException

读取一个输入字节,将其零扩展为 int 类型,并返回结果,因此范围为 0 到 255。此方法适用于读取接口 DataOutput 的 writeByte 方法写入的字节,前提是 writeByte 的参数为 旨在为 0 到 255 范围内的值。

返回:

读取的无符号 8 位值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readShort

short readShort() throws IOException

读取两个输入字节并返回一个短值。 设 a 为读取的第一个字节, b 为第二个字节。 返回的值为:

(short)((a << 8) | (b & 0xff)) 

该方法适用于读取接口DataOutput的writeShort方法写入的字节。

返回:

读取的 16 位值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readUnsignedShort

int readUnsignedShort() throws IOException

读取两个输入字节并返回 0 到 65535 范围内的 int 值。设 a 为读取的第一个字节,b 为第二个字节。 返回的值为:

(((a & 0xff) << 8) | (b & 0xff)) 

如果 writeShort 的参数打算是 0 到 65535 范围内的值,则此方法适用于读取接口 DataOutput 的 writeShort 方法写入的字节。

返回:

读取的无符号 16 位值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readChar

char readChar() throws IOException

读取两个输入字节并返回一个 char 值。 设 a 为读取的第一个字节, b 为第二个字节。 返回的值为:

(char)((a << 8) | (b & 0xff)) 

该方法适用于读取接口DataOutput的writeChar方法写入的字节。

返回:

读取的 char 值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readInt

int readInt() throws IOException

读取四个输入字节并返回一个 int 值。 让 a-d 成为读取的第一个到第四个字节。 返回的值为:

 (((a & 0xff) << 24) | ((b & 0xff) << 16) |
  ((c & 0xff) <<  8) | (d & 0xff))

该方法适用于读取接口DataOutput的writeInt方法写入的字节。

返回:

读取的 int 值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readLong

long readLong() throws IOException

读取八个输入字节并返回一个 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 值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readFloat

float readFloat() throws IOException

读取四个输入字节并返回一个浮点值。 它首先按照 readInt 方法的方式构造一个 int 值,然后按照 Float.intBitsToFloat 方法的方式将此 int 值转换为浮点数。 该方法适用于读取接口DataOutput的writeFloat方法写入的字节。

返回:

读取的浮点值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readDouble

double readDouble() throws IOException

读取八个输入字节并返回一个双精度值。 它首先按照 readLong 方法的方式构造一个 long 值,然后按照 Double.longBitsToDouble 方法的方式将此 long 值转换为 double。 该方法适用于读取接口DataOutput的writeDouble方法写入的字节。

返回:

读取的双精度值。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。

readLine

String readLine() throws IOException

从输入流中读取下一行文本。它读取连续的字节,将每个字节分别转换为一个字符,直到遇到行终止符或文件结尾;然后将读取的字符作为字符串返回。请注意,由于此方法处理字节,因此它不支持输入完整的 Unicode 字符集。

如果在读取一个字节之前遇到文件结尾,则返回 null。否则,读取的每个字节都通过零扩展转换为 char 类型。如果遇到字符“\n”,则将其丢弃并停止读取。如果遇到字符“\r”,则将其丢弃,如果后面的字节转换为字符“\n”,则也将其丢弃;然后停止阅读。如果在遇到字符 ‘\n’ 和 ‘\r’ 之前遇到文件结尾,则停止读取。停止读取后,将返回一个字符串,其中包含按顺序读取且未丢弃的所有字符。请注意,此字符串中的每个字符的值都小于 \u0100,即 (char)256。

返回:

输入流中的下一行文本,如果在读取字节之前遇到文件结尾,则返回 null。

Throws:

Throw名称Throw描述
IOException如果发生 I/O 错误。

readUTF

String readUTF() throws IOException

读取使用修改后的 UTF-8 格式编码的字符串。 readUTF 的一般约定是它读取以修改后的 UTF-8 格式编码的 Unicode 字符串的表示;然后这个字符串作为字符串返回。

首先,读取两个字节并使用 readUnsignedShort 方法的方式构造一个无符号的 16 位整数。这个整数值称为 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。

在通过此过程将每个组转换为字符后,按照从输入流中读取相应组的相同顺序收集字符,形成一个字符串,然后返回该字符串。

接口DataOutput的writeUTF方法可用于写入适合该方法读取的数据。

返回:

一个 Unicode 字符串。

Throws:

Throw名称Throw描述
EOFException如果此流在读取所有字节之前到达末尾。
IOException如果发生 I/O 错误。
UTFDataFormatException如果字节不代表字符串的有效修改 UTF-8 编码。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/205012.html<

(0)
运维的头像运维
上一篇2025-04-07 10:17
下一篇 2025-04-07 10:18

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注