DataOutput的架构
DataOutput的基类
DataOutput概述
DataOutput接口提供了将数据从任何Java基元类型转换为一系列字节并将这些字节写入二进制流的功能。还有一种工具可以将String转换为修改后的UTF-8格式并编写生成的字节序列。对于该接口中所有写字节的方法,如果一个字节由于任何原因不能被写,通常会抛出IOException。
UML概述
重要方法
write
将数组b中的所有字节写入输出流。如果b为空,抛出NullPointerException。如果b.length为零,则不写入字节。否则,先写字节b[0],然后写b[1],以此类推;写入的最后一个字节是b[b.length-1]。
void write(byte b[], int off, int len) throws IOException;
writeBoolean
将布尔值写入此输出流。如果参数v为真,则写入值(字节)1;如果v为false,则将值(字节)0写入。接口DataInput的readBoolean方法可以读取该方法写入的字节,该方法将返回一个等于v的布尔值。
void writeBoolean(boolean v) throws IOException;
writeByte
将参数v的8个低阶位写入输出流。v的24个高阶位被忽略。(这意味着writeByte对整型参数所做的事情与write完全相同。)接口DataInput的readByte方法可以读取该方法写入的字节,该方法随后将返回一个等于(byte)v的字节。
void writeByte(int v) throws IOException;
writeShort
将两个字节写入输出流以表示参数的值。要写入的字节值,按如下顺序排列:
(byte)(0xff & (v >> 8)) // 将第一个字节移动到低字节位,并截断为byte
(byte)(0xff & v) // 保留低字节位,高字节位为0,并截断为byte
接口DataInput的readShort方法可以读取该方法写入的字节,该方法随后将返回一个等于(short)v的short。
void writeShort(int v) throws IOException;
writeChar
将字符值(由两个字节组成)写入输出流。要写入的字节值,按如下顺序排列:
(byte)(0xff & (v >> 8))
(byte)(0 xff & v)
接口DataInput的readChar方法可以读取该方法写入的字节,该方法将返回一个等于(char)v的char。
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。
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。
void writeLong(long v) throws IOException;
writeFloat
将由4个字节组成的浮点值写入输出流。它执行此操作时,就好像它首先按照float的方式将此浮点值转换为int。floatToIntBits方法,然后以与writeInt方法完全相同的方式写入int值。接口DataInput的readFloat方法可以读取该方法写入的字节,该方法将返回一个等于v的浮点数。
void writeFloat(float v) throws IOException;
writeDouble
将双精度值(由8个字节组成)写入输出流。它这样做,就好像它首先将这个double值转换为a long,完全按照double的方式。doubleToLongBits方法,然后以writeLong方法的方式准确地写入长值。接口DataInput的readDouble方法可以读取该方法写入的字节,该方法将返回一个等于v的double。
void writeDouble(double v) throws IOException;
writeBytes
将字符串写入输出流。对于字符串s中的每个字符(按顺序),一个字节被写入输出流。如果s为空,抛出NullPointerException。
如果s.length为零,则不写入字节。否则,先写字符s[0],然后写s[1],以此类推;写的最后一个字符是s[s.l length-1]。对于每个字符,将按照writeByte方法的确切方式编写一个字节,即低阶字节。字符串中每个字符的高阶8位将被忽略。
void writeBytes(String s) throws IOException;
writeChars
将字符串s中的每个字符按顺序(每个字符两个字节)写入输出流。如果s为空,抛出NullPointerException。如果s.length为零,则不写入任何字符。否则,先写字符s[0],然后写s[1],以此类推;写的最后一个字符是s[s.l length-1]。对于每个字符,实际写入两个字节,高阶字节优先,这与writeChar方法的方式完全相同。
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。
void writeUTF(String s) throws IOException;