DataInputStream和DataOutputStream通过大端序二进制编码读写Java八种基本类型,必须包装在字节流上,读写顺序须严格一致,char写Unicode码点、boolean存为单字节、float/double存在精度误差。

用 DataInputStream 和 DataOutputStream 读写 Java 八种基本数据类型,关键在于理解它们的二进制编码规则和平台一致性设计——Java 默认采用大端序(Big-Endian),所有类型写入时都按固定字节数、标准 IEEE 754 或 Unicode 编码布局,无需手动处理字节序。
必须套在字节流上,不能单独使用
DataInputStream 和 DataOutputStream 是过滤流,本身不关联物理设备或内存,必须包装在底层字节流之上:
- 写入时:用 DataOutputStream 包装
FileOutputStream或ByteArrayOutputStream - 读取时:用 DataInputStream 包装
FileInputStream或ByteArrayInputStream - 推荐加
BufferedInputStream/OutputStream提升性能,尤其对频繁 IO 的场景
每种类型对应明确的字节长度和编码方式
Java 规范强制定义了各类型的二进制表示,写入即按标准布局,读取时自动解析,天然保持字节序一致:
-
byte / boolean:各占 1 字节;
writeByte(int)写低 8 位;writeBoolean(boolean)写 0x00 或 0x01 -
short / char:各占 2 字节,大端序;
writeShort(123)→0x00 0x7B;writeChar('中')→ UTF-16 编码值(如0x4E2D) -
int / float:各占 4 字节,大端序;
writeInt(-1)→0xFF 0xFF 0xFF 0xFF;writeFloat(3.14f)按 IEEE 754 单精度编码 -
long / double:各占 8 字节,大端序;
writeLong(1000L)→0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xE8
读写顺序必须严格一致
数据流是顺序型协议,没有字段名或类型标记。读取端必须按写入顺序、一一对应调用方法,否则会错位解码:
立即学习“Java免费学习笔记(深入)”;
- 例如写入:
dos.writeUTF("name"); dos.writeInt(1001); dos.writeDouble(99.5); - 则读取必须:
dis.readUTF(); dis.readInt(); dis.readDouble(); - 若跳过或颠倒,
readInt()可能读到字符串的前 4 字节,结果为任意整数,且后续全部错乱
避免常见陷阱:char 与字符串、boolean 存储语义
几个容易出错但文档常忽略的细节:
-
char 不是字符集转换:
writeChar('€')写的是 Unicode 码点0x20AC(2 字节),不是 UTF-8 编码;若需 UTF-8,应改用writeUTF(String) -
boolean 本质是 byte:虽然逻辑只有 true/false,但
writeBoolean(true)实际写入单字节0x01,不是 bit 位;readBoolean()仅检查该字节是否非零 -
float/double 精度不可靠:写入
0.1f后读回仍是相同 IEEE 表示,但==判断仍可能因浮点误差失败;业务敏感场景建议用字符串或 BigDecimal 序列化


















