Module java.base
Package java.io

Interface DataInput

已知的所有子接口:
ImageInputStream, ImageOutputStream, ObjectInput
已知的所有实现类:
DataInputStream, FileCacheImageInputStream, FileCacheImageOutputStream, FileImageInputStream, FileImageOutputStream, ImageInputStreamImpl, ImageOutputStreamImpl, MemoryCacheImageInputStream, MemoryCacheImageOutputStream, ObjectInputStream, RandomAccessFile

public interface DataInput
DataInput 接口提供了从二进制流中读取字节并从中重建任何Java原始类型数据的功能。还提供了一种从 修改的UTF-8 格式数据中重建 String 的方法。

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

修改的UTF-8

DataInput 和 DataOutput 接口的实现以一种略微修改的UTF-8格式表示Unicode字符串。(有关标准UTF-8格式的信息,请参阅《Unicode标准,版本4.0》的第3.9节“Unicode编码形式”)

  • 范围在 '\u0001''\u007F' 的字符由一个字节表示。
  • 空字符 '\u0000' 和范围在 '\u0080''\u07FF' 的字符由两个字节表示。
  • 范围在 '\u0800''\uFFFF' 的字符由三个字节表示。
UTF-8 值的编码
字节 位值
7 6 5 4 3 2 1 0
\u0001\u007F 1 0 位6-0
\u0000,
\u0080\u07FF
1 1 1 0 位10-6
2 1 0 位5-0
\u0800\uFFFF 1 1 1 1 0 位15-12
2 1 0 位11-6
3 1 0 位5-0

该格式与标准UTF-8格式之间的差异如下:

  • 空字节 '\u0000' 以2字节格式编码,而不是1字节,因此编码的字符串中不会有嵌入的空字节。
  • 仅使用1字节、2字节和3字节格式。
  • 补充字符 以代理对的形式表示。
自:
1.0
参见:
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    读取一个输入字节,并在该字节为非零时返回 true,在该字节为零时返回 false
    byte
    读取并返回一个输入字节。
    char
    读取两个输入字节并返回一个 char 值。
    double
    读取八个输入字节并返回一个 double 值。
    float
    读取四个输入字节并返回一个 float 值。
    void
    readFully(byte[] b)
    从输入流中读取一些字节并将它们存储到缓冲区数组 b 中。
    void
    readFully(byte[] b, int off, int len)
    从输入流中读取 len 个字节。
    int
    读取四个输入字节并返回一个 int 值。
    从输入流中读取下一行文本。
    long
    读取八个输入字节并返回一个 long 值。
    short
    读取两个输入字节并返回一个 short 值。
    int
    读取一个输入字节,将其零扩展为类型 int,并返回结果,因此结果在 0255 的范围内。
    int
    读取两个输入字节并返回一个 int 值,范围在 065535
    以使用 修改的UTF-8 格式编码的字符串形式读取。
    int
    skipBytes(int n)
    尝试跳过输入流中的 n 个字节的数据,丢弃已跳过的字节。
  • Method Details

    • readFully

      void readFully(byte[] b) throws IOException
      从输入流中读取一些字节并将它们存储到缓冲区数组 b 中。读取的字节数等于 b 的长度。

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

      • b.length 字节的输入数据可用,此时会正常返回。
      • 检测到文件末尾,此时会抛出一个 EOFException
      • 发生I/O错误,此时会抛出一个除 EOFException 之外的 IOException

      如果 bnull,则会抛出一个 NullPointerException。如果 b.length 为零,则不会读取任何字节。否则,第一个读取的字节存储在元素 b[0] 中,下一个字节存储在 b[1] 中,依此类推。如果从此方法中抛出异常,则可能是 b 的一些但不是全部字节已更新为来自输入流的数据。

      参数:
      b - 要读取数据的缓冲区。
      抛出:
      NullPointerException - 如果 bnull
      EOFException - 如果此流在读取所有字节之前到达末尾。
      IOException - 如果发生I/O错误。
    • readFully

      void readFully(byte[] b, int off, int len) throws IOException
      从输入流中读取 len 个字节。

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

      • len 字节的输入数据可用,此时会正常返回。
      • 检测到文件末尾,此时会抛出一个 EOFException
      • 发生I/O错误,此时会抛出一个除 EOFException 之外的 IOException

      如果 bnull,则会抛出一个 NullPointerException。如果 off 为负数,或者 len 为负数,或者 off+len 大于数组 b 的长度,则会抛出一个 IndexOutOfBoundsException。如果 len 为零,则不会读取任何字节。否则,第一个读取的字节存储在元素 b[off] 中,下一个字节存储在 b[off+1] 中,依此类推。读取的字节数最多等于 len

      参数:
      b - 读取数据的缓冲区。
      off - 指定数据数组b中的偏移量。
      len - 指定要读取的字节数。
      抛出:
      NullPointerException - 如果bnull
      IndexOutOfBoundsException - 如果off为负数,len为负数,或len大于b.length - off
      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
      读取一个输入字节,将其零扩展为类型int,并返回结果,因此结果在0255的范围内。此方法适用于读取由接口DataOutputwriteByte方法写入的字节,如果writeByte的参数旨在是0255范围内的值。
      返回:
      读取的无符号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
      读取两个输入字节并返回一个int值,范围在065535之间。设a为第一个读取的字节,b为第二个字节。返回的值为:
      (((a & 0xff) << 8) | (b & 0xff))
       
      此方法适用于读取由接口DataOutputwriteShort方法写入的字节,如果writeShort的参数旨在是065535范围内的值。
      返回:
      读取的无符号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值,然后将此int值转换为float,方法与Float.intBitsToFloat方法完全相同。此方法适用于读取由接口DataOutputwriteFloat方法写入的字节。
      返回:
      读取的float值。
      抛出:
      EOFException - 如果在读取所有字节之前流到达结尾。
      IOException - 如果发生I/O错误。
    • readDouble

      double readDouble() throws IOException
      读取八个输入字节并返回一个double值。它首先以readLong方法的方式构造一个long值,然后将此long值转换为double,方法与Double.longBitsToDouble方法完全相同。此方法适用于读取由接口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,然后返回。

      接口DataOutputwriteUTF方法可用于写入适合由此方法读取的数据。

      返回:
      一个Unicode字符串。
      抛出:
      EOFException - 如果在读取所有字节之前此流到达结尾。
      IOException - 如果发生I/O错误。
      UTFDataFormatException - 如果字节不表示字符串的有效修改后的UTF-8编码。