在Java编程中,DataInputStream
是一个用于读取基本数据类型(如int
、double
、boolean
)和UTF字符串的实用工具类,它属于java.io
包的核心组件,常与DataOutputStream
配对使用,适用于需要精确控制二进制数据输入的场景。
读取基本数据类型
直接支持readInt()
、readDouble()
、readBoolean()
等方法,无需手动解析字节。
DataInputStream dis = new DataInputStream(new FileInputStream("data.bin")); int num = dis.readInt(); double value = dis.readDouble();
处理UTF编码字符串
通过readUTF()
方法读取由DataOutputStream
写入的字符串,自动处理字符编码。
String text = dis.readUTF();
字节顺序控制
与DataOutputStream
配合时,严格遵循大端序(Big-Endian),确保跨平台数据一致性。
二进制文件读取
适用于解析自定义二进制格式文件(如游戏存档、日志文件):
try (DataInputStream dis = new FileInputStream("data.dat")) { while (dis.available() > 0) { int id = dis.readInt(); String name = dis.readUTF(); double price = dis.readDouble(); } }
网络数据传输
在Socket通信中与DataOutputStream
配合,实现结构化数据传输:
Socket socket = new Socket("127.0.0.1", 8080); DataInputStream dis = new DataInputStream(socket.getInputStream()); int statusCode = dis.readInt();
跨语言数据交换
生成符合特定协议的二进制数据,供其他语言(如C++、Python)解析。
EOFException
或数据错误。try-with-resources
语法自动关闭流,避免内存泄漏:try (DataInputStream dis = new FileInputStream("data.bin")) { // 读取操作 }
IOException
并对文件结束(EOF)做显式判断:try { while (true) { int data = dis.readInt(); } } catch (EOFException e) { System.out.println("数据读取完成"); }
缓冲区包装
为提升读取效率,建议用BufferedInputStream
作为中间层:
DataInputStream dis = new DataInputStream( new BufferedInputStream(new FileInputStream("data.bin")) );
批量读取
频繁调用单字节读取方法(如readByte()
)会降低性能,优先使用块读取方法read(byte[] b)
。
避免混合使用其他流
若需读取文本,应单独使用BufferedReader
,而非混合DataInputStream
的readUTF()
与其他文本方法。
readInt()
与readDouble()
顺序颠倒)。readChar()
或手动解码字节数组。