DataInputStream是Java中一个重要的输入流类,用于从底层输入流中读取Java原始数据类型(如int、float、double等)和字符串,它位于java.io
包中,通常与DataOutputStream配合使用,实现跨平台的数据序列化和反序列化。
原始数据类型读取
直接支持8种基础数据类型的读取:
readBoolean() // 读取布尔值 readByte() // 读取字节 readShort() // 读取短整型 readInt() // 读取整型 readLong() // 读取长整型 readFloat() // 读取单精度浮点数 readDouble() // 读取双精度浮点数 readUTF() // 读取UTF-8编码字符串
字节顺序一致性
始终按照大端序(Big-Endian)读取数据,确保跨平台数据交换的一致性。
装饰器模式
需包裹其他输入流(如FileInputStream、ByteArrayInputStream)使用,扩展其功能。
读取二进制文件
例如解析由DataOutputStream生成的二进制文件:
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) { int value = dis.readInt(); String text = dis.readUTF(); } catch (IOException e) { e.printStackTrace(); }
网络通信
与Socket结合,处理TCP/UDP传输的二进制数据流。
内存数据处理
通过ByteArrayInputStream解析字节数组中的结构化数据。
严格的数据顺序
读取顺序必须与写入顺序完全一致,否则会导致数据解析错误。
异常处理
所有读取方法可能抛出IOException
,需通过try-catch或throws处理。
资源释放
推荐使用try-with-resources自动关闭流,避免内存泄漏:
try (DataInputStream dis = ...) { ... }
缓冲区包装
对文件或网络流,建议包裹BufferedInputStream提升读取效率:
DataInputStream dis = new DataInputStream(new BufferedInputStream(fileStream));
批量读取
连续读取多个字段时,避免频繁单字节读取,优先使用批量方法如readFully(byte[])
。
字符编码readUTF()
仅支持修改版UTF-8编码,其他编码需通过InputStreamReader转换。
// 写入数据 try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) { dos.writeInt(1024); dos.writeUTF("示例文本"); } // 读取数据 try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) { int number = dis.readInt(); // 输出:1024 String text = dis.readUTF(); // 输出:示例文本 }
读取时出现EOFException
需检查文件是否损坏或读取位置超出数据范围。
数据乱码
确认字符串是否通过writeUTF()
写入,或改用字节数组处理自定义编码。
性能瓶颈
大文件处理时,未使用缓冲流可能导致效率低下。
DataInputStream
的定义。