JavaTM 2 Platform
Standard Ed. 6

java.io
介面 DataInput

所有已知子介面:
ImageInputStream, ImageOutputStream, ObjectInput
所有已知實作類別:
DataInputStream, FileCacheImageInputStream, FileCacheImageOutputStream, FileImageInputStream, FileImageOutputStream, ImageInputStreamImpl, ImageOutputStreamImpl, MemoryCacheImageInputStream, MemoryCacheImageOutputStream, ObjectInputStream, RandomAccessFile

public interface DataInput

DataInput 介面用於從二進制串流中讀取位元組,並根據所有 Java 基本型別資料進行重構。同時還提供根據 UTF-8 修改版格式的資料重構 String 的工具。

對於此介面中的所有資料讀取例程來說,如果在讀取所需位元組數之前已經到達檔案末尾 (end of file),則將拋出 EOFExceptionIOException 的一種)。如果因為到達檔案末尾以外的其他原因無法讀取位元組,則將拋出 IOException 而不是 EOFException。尤其是,在輸入串流已關閉的情況下,將拋出 IOException

UTF-8 修改版

DataInput 和 DataOutput 介面的實作表示稍作改版的 UTF-8 格式的 Unicode 字元串。(關於標準 UTF-8 格式的資訊,請參閱 The Unicode Standard, Version 4.03.9 Unicode Encoding Forms 節)。注意,在下表中,最高有效位顯示在最左邊的列中。

'\u0001''\u007F' 範圍內的所有字元都是用單個位元組表示的:

位值
位元組 1
0
位 6-0

null 字元 '\u0000' 以及從 '\u0080''\u07FF' 的範圍內的字元用兩個位元組表示:

位值
位元組 1
1
1
0
位 10-6
位元組 2
1
0
位 5-0

'\u0800''\uFFFF' 範圍內的 char 值用三個位元組表示:
位值
位元組 1
1
1
1
0
位 15-12
位元組 2
1
0
位 11-6
位元組 3
1
0
位 5-0

這種格式與標準 UTF-8 格式之間的不同如下:

從以下版本開始:
JDK1.0
另請參見:
DataInputStream, DataOutput

方法摘要
 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 型別,並返回結果,所以結果的範圍是 0255
 int readUnsignedShort()
          讀取兩個輸入位元組,並返回 065535 範圍內的一個 int 值。
 String readUTF()
          讀入一個已使用 UTF-8 修改版格式編碼的字元串。
 int skipBytes(int n)
          試圖在輸入串流中跳過資料的 n 個位元組,並丟棄跳過的位元組。
 

方法詳細資訊

readFully

void readFully(byte[] b)
               throws IOException
從輸入串流中讀取一些位元組,並將它們存儲在緩衝區陣列 b 中。讀取的位元組數等於 b 的長度。

在出現以下條件之一以前,此方法將一直阻塞:

如果 bnull,則拋出 NullPointerException。如果 b.length 為零,則不讀取位元組。否則,將讀取的第一個位元組存儲到元素 b[0] 中,下一個位元組存儲到 b[1] 中,依此類別推。如果此方法拋出異常,則可能是因為已經用輸入串流中的資料更新了 b 的某些(但非全部)位元組。

參數:
b - 存儲讀取資料的緩衝區。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readFully

void readFully(byte[] b,
               int off,
               int len)
               throws IOException
從輸入串流中讀取 len 個位元組。

在出現以下條件之一以前,此方法將一直阻塞:

如果 bnull,則拋出 NullPointerException。如果 off 為負,或 len 為負,或者 off+len 大於陣列 b 的長度,則拋出 IndexOutOfBoundsException。如果 len 為零,則不讀取位元組。否則,將讀取的第一個位元組存儲到元素 b[off] 中,下一個位元組存儲到 b[off+1] 中,依此類別推。讀取的位元組數至多等於 b[0]

參數:
b - 存儲讀取資料的緩衝區。
off - 指定資料中的偏移量的 int 值。
len - 指定讀取的位元組數的 int 值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

skipBytes

int skipBytes(int n)
              throws IOException
試圖在輸入串流中跳過資料的 n 個位元組,並丟棄跳過的位元組。不過,可以跳過更少的位元組數,該位元組數甚至可以為零。這可能由很多情況引起;在已經跳過 n 個位元組前到達檔案末尾只是其中的一種可能。此方法從不拋出 EOFException。返回實際跳過的位元組數。

參數:
n - 要跳過的位元組數。
返回:
實際跳過的位元組數。
拋出:
IOException - 如果發生 I/O 錯誤。

readBoolean

boolean readBoolean()
                    throws IOException
讀取一個輸入位元組,如果該位元組不是零,則返回 true,如果是零,則返回 false。此方法適用於讀取用介面 DataOutputwriteBoolean 方法寫入的位元組。

返回:
讀取的 boolean 值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readByte

byte readByte()
              throws IOException
讀取並返回一個輸入位元組。該位元組被看作是 -128127(包含)範圍內的一個有符號值。此方法適用於讀取用介面 DataOutputwriteByte 方法寫入的位元組。

返回:
讀取的 8 位值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readUnsignedByte

int readUnsignedByte()
                     throws IOException
讀取一個輸入位元組,將它左側補零 (zero-extend) 轉變為 int 型別,並返回結果,所以結果的範圍是 0255。如果介面 DataOutputwriteByte 方法的參數是 0255 之間的值,則此方法適用於讀取用 writeByte 寫入的位元組。

返回:
讀取的無符號 8 位值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readShort

short readShort()
                throws IOException
讀取兩個輸入位元組並返回一個 short 值。設 a 為第一個讀取位元組,b 為第二個讀取位元組。返回的值是:

(short)((a << 8) | (b & 0xff))
 
此方法適用於讀取用介面 DataOutputwriteShort 方法寫入的位元組。

返回:
讀取的 16 位值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readUnsignedShort

int readUnsignedShort()
                      throws IOException
讀取兩個輸入位元組,並返回 065535 範圍內的一個 int 值。設 a 為第一個讀取位元組,b 為第二個讀取位元組。返回的值是:

(((a & 0xff) << 8) | (b & 0xff))
 
如果介面 DataOutputwriteShort 方法的參數是 065535 範圍內的值,則此方法適用於讀取用 writeShort 寫入的位元組。

返回:
讀取的無符號 16 位值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readChar

char readChar()
              throws IOException
讀取兩個輸入位元組並返回一個 char 值。設 a 為第一個讀取位元組,b 為第二個讀取位元組。返回的值是:

(char)((a << 8) | (b & 0xff))
 
此方法適用於讀取用介面 DataOutputwriteChar 方法寫入的位元組。

返回:
讀取的 char 值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readInt

int readInt()
            throws IOException
讀取四個輸入位元組並返回一個 int 值。設 a-d 為四個讀取位元組中的第一個位元組。返回的值是:

 
 (((a & 0xff) << 24) | ((b & 0xff) << 16) |
  ((c & 0xff) << 8) | (d & 0xff))
 
此方法適用於讀取用介面 DataOutputwriteInt 方法寫入的位元組。

返回:
讀取的 int 值。
拋出:
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)))
 

此方法適用於讀取用介面 DataOutputwriteLong 方法寫入的位元組。

返回:
讀取的 long 值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readFloat

float readFloat()
                throws IOException
讀取四個輸入位元組並返回一個 float 值。實作這一點的方法是:先使用與 readInt 方法完全相同的方式建構一個 int 值,然後使用與 Float.intBitsToFloat 方法完全相同的方式將此 int 值轉換成一個 float 值。此方法適用於讀取用介面 DataOutputwriteFloat 方法寫入的位元組。

返回:
讀取的 float 值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readDouble

double readDouble()
                  throws IOException
讀取八個輸入位元組並返回一個 double 值。實作這一點的方法是:先使用與 readlong 方法完全相同的方式建構一個 long 值,然後使用與 Double.longBitsToDouble 方法完全相同的方式將此 long 值轉換成一個 double 值。此方法適用於讀取用介面 DataOutputwriteDouble 方法寫入的位元組。

返回:
讀取的 double 值。
拋出:
EOFException - 如果此串流在讀取所有位元組之前到達末尾。
IOException - 如果發生 I/O 錯誤。

readLine

String readLine()
                throws IOException
從輸入串流中讀取下一文本行。該方法讀取連續的位元組,將每個位元組分別轉換成一個字元,直到遇到行結尾符或到達末尾;然後以 String 形式返回讀取的字元。注意,因為此方法用於處理字元,所以它不支持整個 Unicode 字元集的輸入。

如果在一個位元組都沒有讀取的時候就到達檔案末尾,則返回 null。否則,通過左側補零將讀取的每個位元組轉換成 char 型別的值。如果遇到字元 '\n',則丟棄它並且停止讀取。如果遇到字元 '\r' 則丟棄它,如果後續位元組轉變成字元 '\n',則同樣丟棄它並停止讀取。如果在遇到字元 '\n''\r' 之一前到達檔案末尾,則停止讀取。一旦已停止讀取,則返回一個 String,它按順序包含所有已讀取且未丟棄的字元。注意,此字元串中的每個字元的值都將小於 \u0100(即 (char)256)的值。

返回:
輸入串流中文本的下一行,如果還沒有讀取一個位元組就到達檔案末尾,則返回 null
拋出:
IOException - 如果發生 I/O 錯誤。

readUTF

String readUTF()
               throws IOException
讀入一個已使用 UTF-8 修改版格式編碼的字元串。readUTF 的常規協定是:該方法讀取使用 UTF-8 修改版格式編碼的 Unicode 字元串的表示形式;然後以 String 的形式返回此字元串。

首先讀取兩個位元組,並使用它們建構一個無符號 16 位整數,建構方式與 readUnsignedShort 方法的方式完全相同。該整數值被稱為 UTF 長度,它指定要讀取的額外位元組數。然後成組地將這些位元組轉換為字元。每組的長度根據該組第一個位元組的值計算。緊跟在某個組後面的位元組(如果有)是下一組的第一個位元組。

如果組的第一個位元組與位網要 0xxxxxxx(其中 x 表示“可能為 01”)比對,則該組只有這一個位元組。該位元組被左側補零,轉換成一個字元。

如果組的第一個位元組與位網要 110xxxxx 比對,則該組只由位元組 a 和另一個位元組 b 組成。如果沒有位元組 b(因為位元組 a 是要讀取的最後一個位元組),或者位元組 b 與位網要 10xxxxxx 不比對,則拋出 UTFDataFormatException。否則,將該組轉換成字元:

(char)(((a& 0x1F) << 6) | (b & 0x3F))
 
如果組的第一個位元組與位網要 1110xxxx 比對,則該組由位元組 a 和另外兩個位元組 bc 組成。如果沒有位元組 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 修改版編碼的字元串。

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only