DataOutput的架构

image.png

DataOutput的基类

DataOutput概述

DataOutput接口提供了将数据从任何Java基元类型转换为一系列字节并将这些字节写入二进制流的功能。还有一种工具可以将String转换为修改后的UTF-8格式并编写生成的字节序列。对于该接口中所有写字节的方法,如果一个字节由于任何原因不能被写,通常会抛出IOException。

UML概述

image.png

重要方法

write

将数组b中的所有字节写入输出流。如果b为空,抛出NullPointerException。如果b.length为零,则不写入字节。否则,先写字节b[0],然后写b[1],以此类推;写入的最后一个字节是b[b.length-1]。

  1. void write(byte b[], int off, int len) throws IOException;

writeBoolean

将布尔值写入此输出流。如果参数v为真,则写入值(字节)1;如果v为false,则将值(字节)0写入。接口DataInput的readBoolean方法可以读取该方法写入的字节,该方法将返回一个等于v的布尔值。

  1. void writeBoolean(boolean v) throws IOException;

writeByte

将参数v的8个低阶位写入输出流。v的24个高阶位被忽略。(这意味着writeByte对整型参数所做的事情与write完全相同。)接口DataInput的readByte方法可以读取该方法写入的字节,该方法随后将返回一个等于(byte)v的字节。

  1. void writeByte(int v) throws IOException;

writeShort

将两个字节写入输出流以表示参数的值。要写入的字节值,按如下顺序排列:

(byte)(0xff & (v >> 8)) // 将第一个字节移动到低字节位,并截断为byte
(byte)(0xff & v) // 保留低字节位,高字节位为0,并截断为byte

接口DataInput的readShort方法可以读取该方法写入的字节,该方法随后将返回一个等于(short)v的short。

  1. void writeShort(int v) throws IOException;

writeChar

将字符值(由两个字节组成)写入输出流。要写入的字节值,按如下顺序排列:

(byte)(0xff & (v >> 8))
(byte)(0 xff & v)

接口DataInput的readChar方法可以读取该方法写入的字节,该方法将返回一个等于(char)v的char。

  1. void writeChar(int v) throws IOException;

writeInt

将一个由4个字节组成的int值写入输出流。要写入的字节值,按如下顺序排列:

(byte)(0xff & (v >> 24))
(byte)(0xff & (v >> 16))
(byte)(0xff & (v >> 8))
(byte)(0 xff & v)

接口DataInput的readInt方法可以读取该方法写入的字节,该方法将返回一个等于v的int。

  1. void writeInt(int v) throws IOException;

writeLong

将一个长值(由8个字节组成)写入输出流。要写入的字节值,按如下顺序排列:

(byte)(0xff & (v >> 56))
(byte)(0xff & (v >> 48))
(byte)(0xff & (v >> 40))
(byte)(0xff & (v >> 32))
(byte)(0xff & (v >> 24))
(byte)(0xff & (v >> 16))
(byte)(0xff & (v >> 8))
(byte)(0 xff & v)

接口DataInput的readLong方法可以读取该方法写入的字节,该方法将返回一个等于v的long。

  1. void writeLong(long v) throws IOException;

writeFloat

将由4个字节组成的浮点值写入输出流。它执行此操作时,就好像它首先按照float的方式将此浮点值转换为int。floatToIntBits方法,然后以与writeInt方法完全相同的方式写入int值。接口DataInput的readFloat方法可以读取该方法写入的字节,该方法将返回一个等于v的浮点数。

  1. void writeFloat(float v) throws IOException;

writeDouble

将双精度值(由8个字节组成)写入输出流。它这样做,就好像它首先将这个double值转换为a long,完全按照double的方式。doubleToLongBits方法,然后以writeLong方法的方式准确地写入长值。接口DataInput的readDouble方法可以读取该方法写入的字节,该方法将返回一个等于v的double。

  1. void writeDouble(double v) throws IOException;

writeBytes

将字符串写入输出流。对于字符串s中的每个字符(按顺序),一个字节被写入输出流。如果s为空,抛出NullPointerException。
如果s.length为零,则不写入字节。否则,先写字符s[0],然后写s[1],以此类推;写的最后一个字符是s[s.l length-1]。对于每个字符,将按照writeByte方法的确切方式编写一个字节,即低阶字节。字符串中每个字符的高阶8位将被忽略。

  1. void writeBytes(String s) throws IOException;

writeChars

将字符串s中的每个字符按顺序(每个字符两个字节)写入输出流。如果s为空,抛出NullPointerException。如果s.length为零,则不写入任何字符。否则,先写字符s[0],然后写s[1],以此类推;写的最后一个字符是s[s.l length-1]。对于每个字符,实际写入两个字节,高阶字节优先,这与writeChar方法的方式完全相同。

  1. void writeChars(String s) throws IOException;

writeUTF

向输出流写入两个字节的长度信息,后面是字符串s中每个字符的修改后的UTF-8表示形式。如果s为null,抛出NullPointerException。字符串s中的每个字符都被转换为一组一个、两个或三个字节,具体取决于字符的值。
字符c在\u0001 ~ \u007f范围内,表示为1字节:

(byte)c

如果字符c是\u0000或在\u0080到\u07ff范围内,则它用两个字节表示,按如下顺序写:

(byte)(0xc0 | (0x1f & (c >> 6)))
(byte)(0x80 | (0x3f & c))

如果字符c在\u0800到uffff的范围内,则用三个字节表示,按如下顺序写:

(byte)(0xe0 | (0x0f & (c >> 12)))
(byte)(0x80 | (0x3f & (c >> 6)))
(byte)(0x80 | (0x3f & c))

首先,计算表示s的所有字符所需的总字节数。如果这个数字大于65535,则抛出UTFDataFormatException。否则,这个长度将完全按照writeShort方法的方式写入输出流;在此之后,将编写字符串s中每个字符的1、2或3字节表示形式。

接口DataInput的readUTF方法可以读取该方法写入的字节,该方法将返回一个等于s的String。

  1. void writeUTF(String s) throws IOException;