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

J2ME RMS 從入門到精通:RecordStore 存儲、序列化與多套件共享全攻略

     編輯:J2ME

RMS 架構概覽

Record Management System (RMS) 是 MIDP 提供的持久化存儲機制,面向字節數組而非結構化字段。核心概念:

  • Record:任意可序列化為 byte[] 的數據(文本、圖片、對象等)。
  • RecordStore:有序記錄集合,保證讀寫原子性,由 javax.microedition.rms.RecordStore 實現。
  • 存儲配額:MIDP 規範要求設備至少提供 8KB;需在 JAD/Manifest 聲明 MIDlet-Data-Size(單位 byte)。
  • 線程安全:單個 RecordStore 操作線程安全,但同套件多 MIDlet 並發訪問需額外同步。
  • 版本差異:MIDP 1.0 僅套件內共享;MIDP 2.0 引入授權模式(AUTHMODE_PRIVATE/PUBLIC)實現跨套件共享。

Java IO 與自定義序列化

J2ME 無原生對象序列化,需手工實現。核心類:

  • ByteArrayOutputStream / ByteArrayInputStream:內存緩衝區 ↔ 字節數組。
  • DataOutputStream / DataInputStream:按基本類型/UTF 字符串讀寫。

優化:避免 toByteArray() 額外拷貝

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

對象序列化範例

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

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

    public static Bank deserialize(byte[] data) throws IOException {
        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
        Bank b = new Bank();
        b.bankName = dis.readUTF();
        b.phone = dis.readUTF();
        b.employeeNum = dis.readInt();
        return b;
    }
}

RecordStore 核心操作


// 打開/創建
RecordStore rs = RecordStore.openRecordStore("MyStore", true);

// 寫入
byte[] data = bank.serialize();
rs.addRecord(data, 0, data.length);

// 讀取(遍歷)
RecordEnumeration re = rs.enumerateRecords(null, null, false);
while (re.hasNextElement()) {
    byte[] rec = re.nextRecord();
    Bank b = Bank.deserialize(rec);
}

// 更新/刪除
rs.setRecord(recordId, newData, 0, newData.length);
rs.deleteRecord(recordId);

// 關閉
rs.closeRecordStore();

實戰避坑指南

  1. 配額測試:模擬器空間往往遠大於真機。建議發布前編寫「遞增寫入 1KB 直到拋出 RecordStoreFullException」的測試 MIDlet,實測真機可用上限(如文中 Nokia 6108 僅 31KB)。
  2. 頻繁讀寫緩存:非易失性存儲速度慢,熱數據應在內存維護副本,批量落盤。
  3. 異常處理:捕獲 RecordStoreException、RecordStoreFullException、RecordStoreNotFoundException 分類處理。
  4. 版本升級:序列化格式變更時,保留 version 字段,反序列化時按版本兼容解析。

總結

RMS 雖輕量但功能完備,掌握「字節流序列化 + RecordStore CRUD + 配額管理 + 線程同步」四大塊,即可應對絕大多數 J2ME 本地存儲需求。

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