首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 基本數據類型與流操作:DataInput/OutputStream 實戰序列化

     編輯:Java 程式設計入門

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 聯網)。

Account 類實現

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");
    }
}

關鍵注意點

  1. 順序必須完全一致:寫入順序 = 讀取順序,否則數據錯位
  2. UTF-8 編碼:writeUTF/readUTF 使用修改版 UTF-8,注意補文字符處理
  3. 版本演進:新增欄位需在末尾,並提供默認值邏輯
  4. 性能:比 Java 原生序列化(Serializable)更輕量、可控、跨語言友好
  5. RandomAccessFile:實現 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);
}

這種手動序列化在嵌入式、移動端、跨平台協議交互中極具價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved