codecamp

鸿蒙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

方法总结

修饰符和类型 方法 描述
boolean readBoolean() 读取一个输入字节,如果该字节非零则返回 true,如果该字节为零则返回 false。
byte readByte() 读取并返回一个输入字节。
char readChar() 读取两个输入字节并返回一个 char 值。
double readDouble() 读取八个输入字节并返回一个双精度值。
float readFloat() 读取四个输入字节并返回一个浮点值。
void readFully(byte[] b) 从输入流中读取一些字节并将它们存储到缓冲区数组中 b。
void readFully(byte[] b, int off, int len) 从输入流中读取 len 个字节。
int readInt() 读取四个输入字节并返回一个 int 值。
String readLine() 从输入流中读取下一行文本。
long readLong() 读取八个输入字节并返回一个 long 值。
short readShort() 读取两个输入字节并返回一个短值。
int readUnsignedByte() 读取一个输入字节,将其零扩展为 int 类型,并返回结果,因此该结果在 0 到 255 的范围内。
int readUnsignedShort() 读取两个输入字节并返回 0 到 65535 范围内的 int 值。
String readUTF() 读取使用修改后的 UTF-8 格式编码的字符串。
int skipBytes(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 编码。
鸿蒙OS Closeable
鸿蒙OS DataOutput
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

鸿蒙OS 开发

鸿蒙OS 术语

鸿蒙OS Java API参考

鸿蒙OS ohos.aafwk.ability

鸿蒙OS ohos.aafwk.abilityjet.activedata

鸿蒙OS ohos.aafwk.content

鸿蒙OS java.lang

鸿蒙OS java.Util

鸿蒙OS java.Util class

鸿蒙OS ohos.data.dataability

鸿蒙OS ohos.data.dataability class

鸿蒙OS ohos.agp.components

鸿蒙OS ohos.agp.components interface

鸿蒙OS ohos.agp.components class

鸿蒙OS ohos.global.configuration

鸿蒙OS java.io

鸿蒙OS ohos.data.resultset

鸿蒙OS ohos.data.resultset interface

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }