接口 DataInput
接口 DataInput
所有已知子接口:public interface DataInput
DataInput 接口用于從二進制流中讀取字節,并根據所有 Java 基本類型數據進行重構。同時還提供根據 UTF-8 修改版格式的數據重構 String 的工具。
對于此接口中的所有數據讀取例程來說,如果在讀取所需字節數之前已經到達文件末尾 (end of file),則將拋出 EOFException(IOException 的一種)。如果因為到達文件末尾以外的其他原因無法讀取字節,則將拋出 IOException 而不是 EOFException。尤其是,在輸入流已關閉的情況下,將拋出 IOException。
UTF-8 修改版
DataInput 和 DataOutput 接口的實現表示稍作改版的 UTF-8 格式的 Unicode 字符串。(關于標準 UTF-8 格式的信息,請參閱 The Unicode Standard, Version 4.0 的 3.9 Unicode Encoding Forms 節)。注意,在下表中,最高有效位顯示在最左邊的列中。
'\u0001' 到 '\u007F' 范圍內的所有字符都是用單個字節表示的:
| ? | 位值||||||||
| ||||||||
null 字符 '\u0000' 以及從 '\u0080' 到 '\u07FF' 的范圍內的字符用兩個字節表示:
| ? | 位值||||||||
| ||||||||
| ||||||||
'\u0800' 到 '\uFFFF' 范圍內的 char 值用三個字節表示:
| ? | 位值||||||||
| ||||||||
| ||||||||
| ||||||||
這種格式與標準 UTF-8 格式之間的不同如下:
- null 字節 '\u0000' 是用 2-byte 格式而不是 1-byte 格式編碼的,因此已編碼的字符串中決不會有嵌入的 null。
- 僅使用 1-byte、2-byte 和 3-byte 格式。
- 增補字符是以代理項對的形式表示的。
?
從以下版本開始:| ?boolean | readBoolean() ??????????讀取一個輸入字節,如果該字節不是零,則返回 true,如果是零,則返回 false。 |
| ?byte | readByte() ??????????讀取并返回一個輸入字節。 |
| ?char | readChar() ??????????讀取兩個輸入字節并返回一個 char 值。 |
| ?double | readDouble() ??????????讀取八個輸入字節并返回一個 double 值。 |
| ?float | readFloat() ??????????讀取四個輸入字節并返回一個 float 值。 |
| ?void | readFully(byte[]?b) ??????????從輸入流中讀取一些字節,并將它們存儲在緩沖區數組 b 中。 |
| ?void | readFully(byte[]?b, int?off, int?len) ??????????從輸入流中讀取 len 個字節。 |
| ?int | readInt() ??????????讀取四個輸入字節并返回一個 int 值。 |
| ?String | readLine() ??????????從輸入流中讀取下一文本行。 |
| ?long | readLong() ??????????讀取八個輸入字節并返回一個 long 值。 |
| ?short | readShort() ??????????讀取兩個輸入字節并返回一個 short 值。 |
| ?int | readUnsignedByte() ??????????讀取一個輸入字節,將它左側補零 (zero-extend) 轉變為 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.length 個字節是可用的,在這種情況下,正常返回。
- 檢測到文件末尾,在這種情況下,拋出 EOFException。
- 發生 I/O 錯誤,在這種情況下,將拋出 IOException,而不是 EOFException。
如果 b 為 null,則拋出 NullPointerException。如果 b.length 為零,則不讀取字節。否則,將讀取的第一個字節存儲到元素 b[0] 中,下一個字節存儲到 b[1] 中,依此類推。如果此方法拋出異常,則可能是因為已經用輸入流中的數據更新了 b 的某些(但非全部)字節。
?
readFully
void readFully(byte[]?b, int?off, int?len) throws IOException在出現以下條件之一以前,此方法將一直阻塞:
?
- 輸入數據的 len 個字節是可用的,在這種情況下,正常返回。
- 檢測到文件末尾,在這種情況下,拋出 EOFException。
- 如果發生 I/O 錯誤,在這種情況下,將拋出 IOException,而不是 EOFException。
如果 b 為 null,則拋出 NullPointerException。如果 off 為負,或 len 為負,或者 off+len 大于數組 b 的長度,則拋出 IndexOutOfBoundsException。如果 len 為零,則不讀取字節。否則,將讀取的第一個字節存儲到元素 b[off] 中,下一個字節存儲到 b[off+1] 中,依此類推。讀取的字節數至多等于 b[0]。
?
skipBytes
int skipBytes(int?n) throws IOException?
readBoolean
boolean readBoolean() throws IOException?
readByte
byte readByte() throws IOException?
readUnsignedByte
int readUnsignedByte() throws IOException?
readShort
short readShort() throws IOException?
(short)((a << 8) | (b & 0xff)) 此方法適用于讀取用接口 DataOutput 的 writeShort 方法寫入的字節。?
readUnsignedShort
int readUnsignedShort() throws IOException?
(((a & 0xff) << 8) | (b & 0xff)) 如果接口 DataOutput 的 writeShort 方法的參數是 0 到 65535 范圍內的值,則此方法適用于讀取用 writeShort 寫入的字節。?
readChar
char readChar() throws IOException?
(char)((a << 8) | (b & 0xff)) 此方法適用于讀取用接口 DataOutput 的 writeChar 方法寫入的字節。?
readInt
int readInt() throws IOException?
(((a & 0xff) << 24) | ((b & 0xff) << 16) |((c & 0xff) << 8) | (d & 0xff)) 此方法適用于讀取用接口 DataOutput 的 writeInt 方法寫入的字節。?
readLong
long readLong() throws IOException?
(((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 方法寫入的字節。
?
readFloat
float readFloat() throws IOException?
readDouble
double readDouble() throws IOException?
readLine
String readLine() throws IOException如果在一個字節都沒有讀取的時候就到達文件末尾,則返回 null。否則,通過左側補零將讀取的每個字節轉換成 char 類型的值。如果遇到字符 '\n',則丟棄它并且停止讀取。如果遇到字符 '\r' 則丟棄它,如果后續字節轉變成字符 '\n',則同樣丟棄它并停止讀取。如果在遇到字符 '\n' 和 '\r' 之一前到達文件末尾,則停止讀取。一旦已停止讀取,則返回一個 String,它按順序包含所有已讀取且未丟棄的字符。注意,此字符串中的每個字符的值都將小于 \u0100(即 (char)256)的值。
?
readUTF
String readUTF() throws IOException首先讀取兩個字節,并使用它們構造一個無符號 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。否則,將該組轉換成字符:如果在執行整個過程中的任意時間到達文件末尾,則拋出 EOFException。
在通過此過程將每個組轉換成字符后,按照從輸入流中讀取相應組的順序,將這些字符收集在一起,形成一個 String,然后該字符串將被返回。
可以使用 DataOutput 接口的 writeUTF 方法寫入適合此方法讀取的數據。
?
?
總結
以上是生活随笔為你收集整理的接口 DataInput的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 500元二手电脑配置推荐?
- 下一篇: 接口 DataOutput