版本
JDK8(JDK1.8)
DataInput接口源码重点
1.DataInput接口提供了从二进制流中读取字节并从中重构任何Java类型的数据的功能,与之对应的是DataOutput,DataOutput接口定义了一系列方法用于将任何Java类型的数据转换为一系列字节,并将这些字节写入二进制Data
DataOutput源码可以看我这篇文章 DataOutput
2.DataInput接口的 void readFully(byte b[]) 方法是一个会阻塞方法,一直阻塞到从二进制流中读取字节填满传入的字节数组b[]才返回
3.DataInput接口的String readUTF() 读取修改的UTF-8格式编码,这种修改的UTF-8格式编码每个字符用1-3个字节表示,读取流程是先读取两个字节,并使用它们以该接口的readUnsignedShort方法的方式构造一个无符号16位整数。 此整数值称为该UTF-8字符串的长度,所以最长能读取65536(2的16次方)个字符,之后就是读取字符了,每个字符对应一个分组(分组指的是1到3个字节),该分组的第一个字节指示该分组的长度,即该字符是由几个字节组成,规则如下
- 如果组的第一个字节与位模式0xxxxxxx(其中x表示“可能是0或1”)匹配,则组仅由该字节组成
- 如果组的第一个字节与位模式110xxxxx匹配, 则该组由该字节a和第二个字节b组成,如果没有字节b,或者如果字节b与位模式10xxxxxx不匹配,则会抛出UTFDataFormatException,否则,组将转换为字符
- 如果组的第一个字节与位模式 1110xxxx匹配, 则该组由该字节a和另外两个字节b和c组成, 如果没有字节c, 或者字节b或字节c与位模式10xxxxxx不匹配,则抛出UTFDataFormatException, 否则,组将转换为字符
4.DataInput接口的方法
| 方法名 | 作用 |
|---|---|
| void readFully(byte b[]) | 从输入流读取一些字节并将它们存储到缓冲区数组b,读取的字节数等于b的长度,没有填满数组b会阻塞 |
| void readFully(byte b[], int off, int len) | 从输入流读取len字节,从偏移量off处开始填入数组b(即从b的off索引处开始填充),必须填满len个字节,在填满之前会阻塞 |
| int skipBytes(int n) | 尝试从输入流中跳过n个字节的数据,丢弃跳过的字节,返回跳过的实际字节数,可能跳过比预期少的字节(因为到文件末尾) |
| boolean readBoolean() | 读取一个输入字节,如果该字节为非零,则返回true,如果该字节为零,则返回false |
| byte readByte() | 读取并返回一个输入字节。该字节被视为-128到127范围内的有符号值 |
| int readUnsignedByte() | 读取一个输入字节,无视符号将其扩展为类型int,并返回结果,因此其范围在0到255之间 |
| short readShort() | 读取两个输入字节并返回short值,即读取的第一个字节为高8位,第二个字节为低8位 |
| int readUnsignedShort() | 读取两个输入字节并返回范围为0到65535的int值 |
| char readChar() | 读取两个输入字节并返回char值(内码中一个char占两个字节,内码定义可以看我DataOutput文章) |
| int readInt() | 读取四个输入字节并返回一个int值,先读取高位字节,再读取低位字节 |
| long readLong() | 读取八个输入字节并返回一个long值 |
| float readFloat() | 读取四个输入字节并返回一个float值 |
| double readDouble() | 读取八个输入字节并返回一个double值 |
| String readLine() | 从输入流中读取下一行文本,它读取连续的字节,将每个字节分别转换为一个字符,直到遇到行终止符或文件结尾,由于一个字节对应一个字符,所以不支持输入完整的Unicode字符集 |
| String readUTF() | 读取使用修改的UTF-8格式编码存储的字符串 |
DataInput接口源码
package java.io;
public
interface DataInput {
// 把给定的数组b全部填满才返回
void readFully(byte b[]) throws IOException;
// 从off偏移量开始填充len个字节到给定数组中才返回,没有填充到len个字节之前会阻塞
void readFully(byte b[], int off, int len) throws IOException;
int skipBytes(int n) throws IOException;
boolean readBoolean() throws IOException;
byte readByte() throws IOException;
int readUnsignedByte() throws IOException;
short readShort() throws IOException;
int readUnsignedShort() throws IOException;
char readChar() throws IOException;
int readInt() throws IOException;
long readLong() throws IOException;
float readFloat() throws IOException;
double readDouble() throws IOException;
String readLine() throws IOException;
String readUTF() throws IOException;
}



