Java 除了二進制、文本文件,還有基於 Data 的數據操作——基本數據類型(byte、int、char、long、float、double、boolean、short)和 String。核心兩類:DataInputStream、DataOutputStream,提供基本類型操作,方法實際定義在 DataInput、DataOutput 介面:將位元組流轉換為基本類型,支援 UTF-8 編碼構建 String。RandomAccessFile 實現雙介面,支援文件同步讀寫。
兩類方法結構簡單:readXXX()、writeXXX(),XXX 代表基本類型或 String。建議研讀 Java Unicode 編碼規則(API 文檔有詳述)。
對象常由基本類型組成(如人員:姓名、郵箱、年齡、性別)。可用 DataOutputStream 按序列寫入,DataInputStream 同序列讀出,實現自定義序列化,適用於數據傳輸(如 J2ME 聯網)。
public class Account {
private String userName;
private String email;
private int age;
private boolean gender;
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");
}
}
writeUTF/readUTF 使用修改版 UTF-8,注意補文字符處理Serializable)更輕量、可控、跨語言友好DataInput/DataOutput,可隨機訪問文件任意位置讀寫// 寫入
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("account.dat"))) {
new Account("Alice", "alice@example.com", 28, true).serialize(dos);
}
// 讀取
try (DataInputStream dis = new DataInputStream(new FileInputStream("account.dat"))) {
Account acc = Account.deserialize(dis);
System.out.println(acc);
}
這種手動序列化在嵌入式、移動端、跨平台協議交互中極具價值。