鴻蒙OS DataInput

2022-10-17 10:51 更新

DataInput

public interface DataInput

DataInput 接口提供從二進制流中讀取字節(jié)并從中重建任何 Java 原始類型的數(shù)據(jù)。 還有一種工具可以從修改后的 UTF-8 格式的數(shù)據(jù)中重建字符串。

對于該接口中的所有讀取例程,通常情況下,如果在讀取所需字節(jié)數(shù)之前到達文件末尾,則會拋出 EOFException(這是一種 IOException)。 如果由于文件結尾以外的任何原因無法讀取任何字節(jié),則拋出除 EOFException 之外的 IOException。 特別是,如果輸入流已關閉,則可能會引發(fā) IOException。

修改后的 UTF-8

DataInput 和 DataOutput 接口的實現(xiàn)以對 UTF-8 稍作修改的格式表示 Unicode 字符串。 (有關標準 UTF-8 格式的信息,請參閱 Unicode 標準版本 4.0 的第 3.9 節(jié) Unicode 編碼形式)。 請注意,在下表中,最高有效位出現(xiàn)在最左側的列中。

此格式與標準 UTF-8 格式的區(qū)別如下:

  • 空字節(jié) '\u0000' 以 2 字節(jié)格式而不是 1 字節(jié)編碼,因此編碼的字符串永遠不會嵌入空值。
  • 僅使用 1 字節(jié)、2 字節(jié)和 3 字節(jié)格式。
  • 補充字符以代理對的形式表示。

Since:

JDK1.0

方法總結

修飾符和類型 方法 描述
boolean readBoolean() 讀取一個輸入字節(jié),如果該字節(jié)非零則返回 true,如果該字節(jié)為零則返回 false。
byte readByte() 讀取并返回一個輸入字節(jié)。
char readChar() 讀取兩個輸入字節(jié)并返回一個 char 值。
double readDouble() 讀取八個輸入字節(jié)并返回一個雙精度值。
float readFloat() 讀取四個輸入字節(jié)并返回一個浮點值。
void readFully(byte[] b) 從輸入流中讀取一些字節(jié)并將它們存儲到緩沖區(qū)數(shù)組中 b。
void readFully(byte[] b, int off, int len) 從輸入流中讀取 len 個字節(jié)。
int readInt() 讀取四個輸入字節(jié)并返回一個 int 值。
String readLine() 從輸入流中讀取下一行文本。
long readLong() 讀取八個輸入字節(jié)并返回一個 long 值。
short readShort() 讀取兩個輸入字節(jié)并返回一個短值。
int readUnsignedByte() 讀取一個輸入字節(jié),將其零擴展為 int 類型,并返回結果,因此該結果在 0 到 255 的范圍內(nèi)。
int readUnsignedShort() 讀取兩個輸入字節(jié)并返回 0 到 65535 范圍內(nèi)的 int 值。
String readUTF() 讀取使用修改后的 UTF-8 格式編碼的字符串。
int skipBytes(int n) 嘗試從輸入流中跳過 n 個字節(jié)的數(shù)據(jù),丟棄跳過的字節(jié)。

方法詳情

readFully

void readFully(byte[] b) throws IOException

從輸入流中讀取一些字節(jié)并將它們存儲到緩沖區(qū)數(shù)組中 b。 讀取的字節(jié)數(shù)等于 b 的長度。

此方法會阻塞,直到發(fā)生以下情況之一:

  • b.length 字節(jié)的輸入數(shù)據(jù)可用,在這種情況下正常返回。
  • 檢測到文件結尾,在這種情況下拋出 EOFException。
  • 發(fā)生 I/O 錯誤,在這種情況下會拋出 EOFException 以外的 IOException。

如果 b 為 null,則拋出 NullPointerException。 如果 b.length 為零,則不讀取任何字節(jié)。 否則,讀取的第一個字節(jié)存儲到元素 b[0] 中,下一個字節(jié)存儲到 b[1] 中,依此類推。 如果此方法引發(fā)異常,則可能是 b 的某些但不是所有字節(jié)已使用來自輸入流的數(shù)據(jù)進行了更新。

參數(shù):

參數(shù)名稱 參數(shù)描述
b 讀取數(shù)據(jù)的緩沖區(qū)。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readFully

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

從輸入流中讀取 len 個字節(jié)。

此方法會阻塞,直到發(fā)生以下情況之一:

  • len 字節(jié)的輸入數(shù)據(jù)可用,在這種情況下會正常返回。
  • 檢測到文件結尾,在這種情況下拋出 EOFException。
  • 發(fā)生 I/O 錯誤,在這種情況下會拋出 EOFException 以外的 IOException。

如果 b 為 null,則拋出 NullPointerException。 如果 off 為負數(shù),或 len 為負數(shù),或 off+len 大于數(shù)組 b 的長度,則拋出 IndexOutOfBoundsException。 如果 len 為零,則不讀取任何字節(jié)。 否則,讀取的第一個字節(jié)存儲到元素 b[off] 中,下一個字節(jié)存儲到 b[off+1] 中,依此類推。 讀取的字節(jié)數(shù)最多等于 len。

參數(shù):

參數(shù)名稱 參數(shù)描述
b 讀取數(shù)據(jù)的緩沖區(qū)。
off 一個 int,指定數(shù)據(jù)的偏移量。
len 一個 int 指定要讀取的字節(jié)數(shù)。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

skipBytes

int skipBytes(int n) throws IOException

嘗試從輸入流中跳過 n 個字節(jié)的數(shù)據(jù),丟棄跳過的字節(jié)。 但是,它可能會跳過一些較小的字節(jié)數(shù),可能為零。 這可能是由多種情況中的任何一種造成的; 在跳過 n 個字節(jié)之前到達文件末尾只是一種可能性。 此方法從不拋出 EOFException。 返回實際跳過的字節(jié)數(shù)。

參數(shù):

參數(shù)名稱 參數(shù)描述
n 要跳過的字節(jié)數(shù)。

返回:

實際跳過的字節(jié)數(shù)。

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯誤。

readBoolean

boolean readBoolean() throws IOException

讀取一個輸入字節(jié),如果該字節(jié)非零則返回 true,如果該字節(jié)為零則返回 false。 該方法適用于讀取接口DataOutput的writeBoolean方法寫入的字節(jié)。

返回:

讀取的布爾值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readByte

byte readByte() throws IOException

讀取并返回一個輸入字節(jié)。 該字節(jié)被視為 -128 到 127(含)范圍內(nèi)的有符號值。 該方法適用于讀取接口DataOutput的writeByte方法寫入的字節(jié)。

返回:

讀取的 8 位值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readUnsignedByte

int readUnsignedByte() throws IOException

讀取一個輸入字節(jié),將其零擴展為 int 類型,并返回結果,因此范圍為 0 到 255。此方法適用于讀取接口 DataOutput 的 writeByte 方法寫入的字節(jié),前提是 writeByte 的參數(shù)為 旨在為 0 到 255 范圍內(nèi)的值。

返回:

讀取的無符號 8 位值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readShort

short readShort() throws IOException

讀取兩個輸入字節(jié)并返回一個短值。 設 a 為讀取的第一個字節(jié), b 為第二個字節(jié)。 返回的值為:

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

該方法適用于讀取接口DataOutput的writeShort方法寫入的字節(jié)。

返回:

讀取的 16 位值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readUnsignedShort

int readUnsignedShort() throws IOException

讀取兩個輸入字節(jié)并返回 0 到 65535 范圍內(nèi)的 int 值。設 a 為讀取的第一個字節(jié),b 為第二個字節(jié)。 返回的值為:

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

如果 writeShort 的參數(shù)打算是 0 到 65535 范圍內(nèi)的值,則此方法適用于讀取接口 DataOutput 的 writeShort 方法寫入的字節(jié)。

返回:

讀取的無符號 16 位值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readChar

char readChar() throws IOException

讀取兩個輸入字節(jié)并返回一個 char 值。 設 a 為讀取的第一個字節(jié), b 為第二個字節(jié)。 返回的值為:

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

該方法適用于讀取接口DataOutput的writeChar方法寫入的字節(jié)。

返回:

讀取的 char 值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readInt

int readInt() throws IOException

讀取四個輸入字節(jié)并返回一個 int 值。 讓 a-d 成為讀取的第一個到第四個字節(jié)。 返回的值為:

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

該方法適用于讀取接口DataOutput的writeInt方法寫入的字節(jié)。

返回:

讀取的 int 值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readLong

long readLong() throws IOException

讀取八個輸入字節(jié)并返回一個 long 值。 讓 a-h 成為讀取的第一個到第八個字節(jié)。 返回的值為:

 (((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方法寫入的字節(jié)。

返回:

讀取的 long 值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readFloat

float readFloat() throws IOException

讀取四個輸入字節(jié)并返回一個浮點值。 它首先按照 readInt 方法的方式構造一個 int 值,然后按照 Float.intBitsToFloat 方法的方式將此 int 值轉(zhuǎn)換為浮點數(shù)。 該方法適用于讀取接口DataOutput的writeFloat方法寫入的字節(jié)。

返回:

讀取的浮點值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readDouble

double readDouble() throws IOException

讀取八個輸入字節(jié)并返回一個雙精度值。 它首先按照 readLong 方法的方式構造一個 long 值,然后按照 Double.longBitsToDouble 方法的方式將此 long 值轉(zhuǎn)換為 double。 該方法適用于讀取接口DataOutput的writeDouble方法寫入的字節(jié)。

返回:

讀取的雙精度值。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。

readLine

String readLine() throws IOException

從輸入流中讀取下一行文本。它讀取連續(xù)的字節(jié),將每個字節(jié)分別轉(zhuǎn)換為一個字符,直到遇到行終止符或文件結尾;然后將讀取的字符作為字符串返回。請注意,由于此方法處理字節(jié),因此它不支持輸入完整的 Unicode 字符集。

如果在讀取一個字節(jié)之前遇到文件結尾,則返回 null。否則,讀取的每個字節(jié)都通過零擴展轉(zhuǎn)換為 char 類型。如果遇到字符“\n”,則將其丟棄并停止讀取。如果遇到字符“\r”,則將其丟棄,如果后面的字節(jié)轉(zhuǎn)換為字符“\n”,則也將其丟棄;然后停止閱讀。如果在遇到字符 '\n' 和 '\r' 之前遇到文件結尾,則停止讀取。停止讀取后,將返回一個字符串,其中包含按順序讀取且未丟棄的所有字符。請注意,此字符串中的每個字符的值都小于 \u0100,即 (char)256。

返回:

輸入流中的下一行文本,如果在讀取字節(jié)之前遇到文件結尾,則返回 null。

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯誤。

readUTF

String readUTF() throws IOException

讀取使用修改后的 UTF-8 格式編碼的字符串。 readUTF 的一般約定是它讀取以修改后的 UTF-8 格式編碼的 Unicode 字符串的表示;然后這個字符串作為字符串返回。

首先,讀取兩個字節(jié)并使用 readUnsignedShort 方法的方式構造一個無符號的 16 位整數(shù)。這個整數(shù)值稱為 UTF 長度,并指定要讀取的附加字節(jié)數(shù)。然后通過分組考慮將這些字節(jié)轉(zhuǎn)換為字符。每個組的長度是根據(jù)組的第一個字節(jié)的值計算的。組后面的字節(jié)(如果有的話)是下一組的第一個字節(jié)。

如果組的第一個字節(jié)與位模式 0xxxxxxx 匹配(其中 x 表示“可能是 0 或 1”),則該組僅由該字節(jié)組成。該字節(jié)被零擴展以形成一個字符。

如果組的第一個字節(jié)與位模式 110xxxxx 匹配,則該組由該字節(jié) a 和第二個字節(jié) b 組成。如果沒有字節(jié) b(因為字節(jié) a 是要讀取的最后一個字節(jié)),或者如果字節(jié) b 與位模式 10xxxxxx 不匹配,則拋出 UTFDataFormatException。否則,該組將轉(zhuǎn)換為字符:

(char)(((a & 0x1F) << 6) | (b & 0x3F)) 

如果組的第一個字節(jié)與位模式 1110xxxx 匹配,則該組由該字節(jié) a 和另外兩個字節(jié) b 和 c 組成。 如果沒有字節(jié) c(因為字節(jié) a 是要讀取的最后兩個字節(jié)之一),或者字節(jié) b 或字節(jié) c 與位模式 10xxxxxx 不匹配,則拋出 UTFDataFormatException。 否則,該組將轉(zhuǎn)換為字符:

 (char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F)) 

如果組的第一個字節(jié)匹配模式 1111xxxx 或模式 10xxxxxx,則拋出 UTFDataFormatException。

如果在整個過程中的任何時候遇到文件結尾,則拋出 EOFException。

在通過此過程將每個組轉(zhuǎn)換為字符后,按照從輸入流中讀取相應組的相同順序收集字符,形成一個字符串,然后返回該字符串。

接口DataOutput的writeUTF方法可用于寫入適合該方法讀取的數(shù)據(jù)。

返回:

一個 Unicode 字符串。

Throws:

Throw名稱 Throw描述
EOFException 如果此流在讀取所有字節(jié)之前到達末尾。
IOException 如果發(fā)生 I/O 錯誤。
UTFDataFormatException 如果字節(jié)不代表字符串的有效修改 UTF-8 編碼。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號