Java 提供 DataInputStream / DataOutputStream 專門處理基本數據類型(byte、short、int、long、float、double、boolean、char)與 String(UTF-8 編碼)的二進制序列化。它們實現了 DataInput/DataOutput 接口,RandomAccessFile 同樣實現這兩個接口,支持隨機讀寫。
| 數據類型 | 寫入方法 | 讀取方法 |
|---|---|---|
| byte | writeByte() | readByte() |
| short | writeShort() | readShort() |
| int | writeInt() | readInt() |
| long | writeLong() | readLong() |
| float | writeFloat() | readFloat() |
| double | writeDouble() | readDouble() |
| boolean | writeBoolean() | readBoolean() |
| char | writeChar() | readChar() |
| String (UTF-8) | writeUTF() | readUTF() |
場景:J2ME/嵌入式/網絡傳輸需輕量級序列化,不依賴 JDK 序列化機制。
public class Account {
private String userName = "";
private String email = "";
private int age = 0;
private boolean gender = false; // true=male, false=female
public Account() {} // 必須有無參構造器
public Account(String userName, String email, int age, boolean gender) {
this.userName = userName;
this.email = email;
this.age = age;
this.gender = gender;
}
// 序列化:按固定順序寫入
public void serialize(DataOutputStream dos) throws IOException {
dos.writeUTF(userName);
dos.writeUTF(email);
dos.writeInt(age);
dos.writeBoolean(gender);
}
// 反序列化:嚴格按相同順序讀取
public static Account deserialize(DataInputStream dis) throws IOException {
Account account = new Account();
account.userName = dis.readUTF();
account.email = dis.readUTF();
account.age = dis.readInt();
account.gender = dis.readBoolean();
return account;
}
@Override
public String toString() {
return "UserName=" + userName + ", Email=" + email + ", Age=" + age +
", Gender=" + (gender ? "Male" : "Female");
}
}
public class TestDataIO {
public static void main(String[] args) throws IOException {
Account original = new Account("mingjava", "eric.zhan@263.net", 25, true);
System.out.println("Before: " + original);
// 內存流演示
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
original.serialize(dos);
dos.flush();
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()));
Account restored = Account.deserialize(dis);
System.out.println("After: " + restored);
dos.close();
dis.close();
}
}
RandomAccessFile 實現定長記錄隨機訪問(如簡易索引)。writeUTF 修改版 UTF-8,字符串長度限 65535 字節,超長需自定義編碼。EOFException、UTFDataFormatException。DataInput/OutputStream 是 Java 處理二進制基本類型的利器,適合高性能、低開銷的序列化場景。掌握其 API 與自定義序列化模式,能應對嵌入式、網絡協議、舊系統集成等多種實戰需求。