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

J2ME RMS 入門到精通(二):Java IO 基礎與對象序列化實戰

     編輯:Java 程式設計入門

為什麼要先講 IO 與序列化?

RMS 只存 byte[],將對象「壓扁」為位元組流、再「膨脹」回對象,是所有持久化與網絡傳輸的基礎功。CLDC 的 IO 輕量且與 J2SE/J2EE 通用,掌握它等於掌握了跨平台數據交換的鑰匙。

CLDC 核心 IO 類速覽

類作用
ByteArrayInputStreambyte[] → 流
ByteArrayOutputStream內存緩衝區 → byte[]
DataInputStream讀基本類型 + String
DataOutputStream寫基本類型 + String

典型組合:new DataOutputStream(new ByteArrayOutputStream()) → 寫入 → toByteArray() 取得 byte[]。

優化 ByteArrayOutputStream:避免雙倍內存拷貝

標準 toByteArray() 會複製內部緩衝區,雙倍內存對移動設備致命。擴展類實現零拷貝:

public class MyByteArrayOutputStream extends ByteArrayOutputStream {
    public byte[] getByteArray() { return buf; } // 直接返回內部緩衝區引用
}

手工實現對象序列化:Bank 類完整示例

public class Bank {
    private String bankName;
    private String phone;
    private int employeeNum;

    // 構造器、getter 省略...

    // 序列化:對象 → byte[]
    public byte[] serialize() throws IOException {
        MyByteArrayOutputStream bos = new MyByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        dos.writeUTF(bankName);
        dos.writeUTF(phone);
        dos.writeInt(employeeNum);
        dos.flush();
        return bos.getByteArray(); // 零拷貝
    }

    // 反序列化:byte[] → 對象
    public Bank deserialize(byte[] data) throws IOException {
        ByteArrayInputStream bis = new ByteArrayInputStream(data);
        DataInputStream dis = new DataInputStream(bis);
        Bank bank = new Bank();
        bank.bankName = dis.readUTF();
        bank.phone = dis.readUTF();
        bank.employeeNum = dis.readInt();
        return bank;
    }
}

配合 RMS 讀寫

// 寫入
Bank aBank = ...;
RecordStore rs = ...;
try {
    byte[] data = aBank.serialize();
    rs.addRecord(data, 0, data.length);
} catch (IOException | RecordStoreException e) { /* handle */ }

// 讀取
byte[] data = rs.getRecord(recordId);
Bank aBank = new Bank().deserialize(data);

設計原則與避坑指南

  1. 字段類型儘量為基本類型 + String,避免對象圖循環引用導致序列化地獄
  2. 版本演進:新增字段時保持向後兼容(讀取時提供默認值)
  3. 異常處理:UTFDataFormatException、EOFException 均需捕獲
  4. 性能:大對象考慮分塊存儲或改用索引文件

下篇預告

深入 RecordStore 進階操作:RecordEnumeration 游標遍歷、RecordFilter/RecordComparator 過濾排序、RecordListener 變更通知、多線程同步最佳實踐。

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