Java 的 I/O 體系中,除了處理二進位檔案與文字檔案外,還提供了針對基本資料型別的操作機制。這裡所謂的「Data」指的就是 Java 的八大基本型別(byte、short、int、long、float、double、char、boolean)以及 String 類別。
操作基本型別的核心類別是 DataInputStream 和 DataOutputStream。它們的方法實際上定義在 DataInput 和 DataOutput 兩個介面中,功能是將位元組流轉換為 Java 基本型別,並支援以 UTF-8 編碼讀寫字串。值得注意的是,RandomAccessFile 同時實作了這兩個介面,使其能對同一檔案進行隨機讀寫。
這兩個類別的方法命名極為規則:readXXX() 和 writeXXX(),其中 XXX 代表型別名稱。利用這機制,我們可以手動實作物件序列化——按固定順序寫入欄位,再按相同順序讀出。這在 J2ME 等無法使用標準序列化的環境中特別實用。
public class Account {
private String userName;
private String email;
private int age;
private boolean gender; // 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 account = new Account("mingJava", "eric.zhan@263.net", 25, true);
System.out.println("before serialization.........");
System.out.println(account);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
account.serialize(dos);
DataInputStream dis = new DataInputStream(
new ByteArrayInputStream(baos.toByteArray()));
Account restored = Account.deserialize(dis);
System.out.println("after serialization..........");
System.out.println(restored);
dos.close();
dis.close();
}
}
控制台輸出確認序列化過程完美還原了物件狀態:
before serialization.........
UserName = mingJava Email = eric.zhan@263.net age = 25 gender = male
after serialization..........
UserName = mingJava Email = eric.zhan@263.net age = 25 gender = male
EOFException。writeUTF/readUTF 使用修改版 UTF-8 編碼,適合字串傳輸。Serializable 介面與 serialVersionUID。