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

J2ME RMS 入門到精通(一):RecordStore 核心機制與存儲限制詳解

     編輯:Java 程式設計入門

RMS 在 J2ME 中的定位

Record Management System (RMS) 是 MIDP 設備實現本地數據持久化的核心子系統。受限於移動設備存儲空間與處理能力,RMS 採用極簡設計:

  • 存儲單元:位元組陣列 (byte[]),不限定數據類型(文本、圖片均可)
  • 邏輯結構:Record Store = 有序記錄集合,記錄不能獨立存在
  • 原子性保證:讀寫操作不可分割,避免數據損壞
  • 線程安全:但多 MIDlet 共享同一 Record Store 時需手動同步

核心 API:javax.microedition.rms.RecordStore

主要方法:

  • openRecordStore(name, createIfNecessary)
  • addRecord(byte[] data, offset, numBytes)
  • getRecord(recordId, buffer, offset) / getRecord(recordId)
  • setRecord(recordId, newData, offset, numBytes)
  • deleteRecord(recordId)
  • getSize() / getSizeAvailable()
  • enumerateRecords(filter, comparator, keepUpdated)

存儲配額與清單聲明

  • MIDP 規範最低保障:8KB 非易失性存儲
  • 應用必須在 MANIFEST.MF 與 .jad 中聲明:MIDlet-Data-Size: 8192(單位:位元組)
  • 聲明值超過設備上限將導致安裝失敗;實際可用空間通常大於聲明值

性能優化與坑點

  • 頻繁讀寫建議加緩存:非易失性存儲讀寫較慢
  • MIDP 1.0 vs 2.0 共享差異:
    • 1.0:同一 MIDlet Suite 內可共享,跨 Suite 隔離
    • 2.0:新增授權模式 (AUTHMODE_PRIVATE/PUBLIC) 與讀寫控制參數,支持跨 Suite 共享
  • 設備實現差異巨大:如 Nokia 6108 getSizeAvailable() 返回 1MB+,實寫 40K 即拋 RecordStoreFullException

實戰:自動測試設備真實 RMS 容量

原理:定時器每 100-500ms 寫入 1KB,捕獲異常時得到上限(精度:KB)。

public class RMSAnalyzer extends MIDlet {
    private Display display;
    private CounterCanvas canvas;

    protected void startApp() {
        display = Display.getDisplay(this);
        int interval = Integer.parseInt(getAppProperty("INTER")); // 間隔毫秒
        canvas = new CounterCanvas(interval, 1, this);
        display.setCurrent(canvas);
    }
    // ... 錯誤提示等輔助方法
}

class CounterCanvas extends Canvas implements CommandListener {
    private RMSModel model;
    private int counter = 1;
    private boolean go = true;
    private Timer timer = new Timer();

    public CounterCanvas(int interval, int base, RMSAnalyzer analyzer) throws RecordStoreException {
        this.model = new RMSModel(base, analyzer);
        TimerTask task = new TimerTask() {
            public void run() {
                try {
                    model.writeRecord(1); // 寫入 1KB
                    counter++;
                } catch (RecordStoreFullException e) {
                    go = false;
                    model.deleteRMS();
                    timer.cancel();
                } catch (RecordStoreException e) {
                    model.deleteRMS();
                    analyzer.showAlertError(e.getMessage());
                    timer.cancel();
                }
                repaint();
            }
        };
        timer.schedule(task, 1000, interval);
    }

    protected void paint(Graphics g) {
        // 繪製進度條
        if (!go) g.drawString("最大值:" + counter + "K字節", 0, 0, Graphics.TOP | Graphics.LEFT);
    }
    // ... 命令處理
}

測試環境:Eclipse 3.0 + EclipseME 0.4.1 + WTK 2.1 + J2SDK 1.4.2_03,Nokia 6108 實測上限 31KB(模擬器結果無參考值)。

下篇預告

深入剖析 javax.microedition.rms 包各類,重點講解 RecordStore 進階用法、數據序列化策略與跨 MIDlet Suite 共享實戰。

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